2012-03-27 72 views
0

我使用django-mptt在Web應用程序的模型上創建樹結構。MySQL可以根據一個NULL值和一個id綁定嗎?

不幸的是 - 偶爾我會在樹中得到重複的根節點。

這些都要NULL作爲PARENT_ID,同樣tree_id,像這樣:

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

有什麼辦法在數據庫級別來制止?
我可以在MySQL中制定一個約束來避免將兩個或多個項目與NULL作爲parent_id和相同的tree_id?從models.py

模型無關的字段中刪除:

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

你可以顯示這個表的ur models.py文件? – Rajeev 2012-03-27 17:02:51

+0

@Rajeev - 我用models.py的最小模型更新了我的問題。 – Bohr 2012-03-27 17:18:57

回答

0

簡單的答案是否定的,但你可以創建INSERT和UPDATE觸發器將阻止新的價值。如果你使用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 ; 
相關問題