0

我使用 django-mptt 在 Web 应用程序中的模型上创建树结构。

不幸的是 - 偶尔我会在树中得到重复的根节点。

这些将具有 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()
4

1 回答 1

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 ;
于 2012-03-27T20:10:27.293 回答