想象一下描述文件系统中文件夹的MySQL表:
folder_id INT,
parent_folder_id INT,
folder_name VARCHAR(64)
我想添加一个约束'parent_folder_id REFERENCES folder_id',以确保数据库中没有死链接。
但是如果文件夹位于顶层,则没有父文件夹,因此它应该为NULL。据我所知,约束不会让我插入带有parent_folder_id = NULL的元组。
如何正确设计?
答案 0 :(得分:2)
我认为您最好使用两个触发器(一个在插入时,一个在更新时)检查 parent_folder_id 在 folder_id 列中的表中是否存在;如果没有引发错误或放弃插入/更新操作
对于根文件夹,请指定 parent_folder_id = 0 ,并在触发器中使用CASE
语句使其有效。
已编辑:将此用作伪代码
CREATE TRIGGER trig_ins BEFORE INSERT ON table
FOR EACH ROW BEGIN
IF (NEW.parent_folder_id > 0) THEN
IF (SELECT COUNT(folder_id) FROM table
WHERE folder_id = NEW.parent_folder_id) = 0 THEN
raise_an_error_here
END
END
END
答案 1 :(得分:2)
您只需添加一个外键:
CREATE TABLE `folder` (
`folder_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`parent_folder_id` INTEGER UNSIGNED,
`folder_name ` VARCHAR(64) NOT NULL,
CONSTRAINT `PK_folder` PRIMARY KEY (`folder_id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `folder` ADD CONSTRAINT `FK_folder_parent_folder`
FOREIGN KEY (`parent_folder_id`) REFERENCES `folder` (`folder_id`)
ON DELETE CASCADE ON UPDATE CASCADE;
parent_folder_id
为NULL
时,外键约束不起作用。
答案 2 :(得分:0)
我应该在文件夹表中添加一个名为“root”的记录,其中parent_folder就是他自己。但是我从未测试过它,也不知道系统是否会接受它。