2012-03-27 3 views
0

django-mptt를 사용하여 웹 응용 프로그램의 모델에 트리 구조를 만듭니다.MySQL은 NULL 값과 id를 결합하여 제한 할 수 있습니까?

불행히도 - 때때로 나무에 중복 루트 노드가 생깁니다.

이들은 PARENT_ID로 NULL이되며,이 같은 같은 tree_id :

+--------+-----------+---------+ 
| id  | parent_id | tree_id | 
+--------+-----------+---------+ 
| 159092 |  NULL | 52098 | 
| 159093 |  NULL | 52098 | 
+--------+-----------+---------+ 

는 데이터베이스 레벨에서이 문제를 막을 수있는 방법이 있나요?
parent_id가 NULL이고 tree_id가 동일한 항목이 2 개 이상 표시되지 않도록 MySQL에서 제한을 설정할 수 있습니까? 제거 관련이없는 필드 models.py에서

모델 :

class Message(MPTTModel): 
    # Threaded messages 
    text = textmodels.TextField() 
+0

이 테이블에 대해 ur models.py 파일을 표시 할 수 있습니까? – Rajeev

+0

@Rajeev - models.py의 최소 모델로 내 질문을 업데이트했습니다. – Bohr

답변

0

간단한 대답이 '아니오',하지만 당신은 새 값을 차단 삽입 및 업데이트 트리거를 만들 수 있습니다. MySQL> = 5.5를 사용하고 있다면 다음과 같이 쓸 수 있습니다 -

DELIMITER | 

DROP TRIGGER IF EXISTS before_msg_insert| 

CREATE TRIGGER before_msg_insert BEFORE INSERT ON message 
FOR EACH ROW 
BEGIN 
    DECLARE xid INT DEFAULT 0; 
    IF (NEW.parent_id IS NULL) THEN 

     SET xid = (SELECT id FROM message WHERE tree_id = NEW.tree_id AND parent_id IS NULL); 

     IF (xid > 0) THEN 
      SET @msg = CONCAT("Root node already exists. ID: ", xid); 
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @msg; 
     END IF; 

    END IF; 
END| 

DROP TRIGGER IF EXISTS before_msg_update| 

CREATE TRIGGER before_msg_update BEFORE UPDATE ON message 
FOR EACH ROW 
BEGIN 
    DECLARE xid INT DEFAULT 0; 
    IF (NEW.parent_id IS NULL) THEN 

     SET xid = (SELECT id FROM message WHERE tree_id = NEW.tree_id AND id <> NEW.id AND parent_id IS NULL); 

     IF (xid > 0) THEN 
      SET @msg = CONCAT("Root node already exists. ID: ", xid); 
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @msg; 
     END IF; 

    END IF; 
END| 

DELIMITER ;