一个可能是NULL值的属性如何仍然可以引用MySQL中的另一个属性

时间:2011-09-23 07:40:05

标签: mysql sql database constraints

想象一下描述文件系统中文件夹的MySQL表:

folder_id INT,
parent_folder_id INT,
folder_name VARCHAR(64)

我想添加一个约束'parent_folder_id REFERENCES folder_id',以确保数据库中没有死链接。

但是如果文件夹位于顶层,则没有父文件夹,因此它应该为NULL。据我所知,约束不会让我插入带有parent_folder_id = NULL的元组。

如何正确设计?

3 个答案:

答案 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_idNULL时,外键约束不起作用。

答案 2 :(得分:0)

我应该在文件夹表中添加一个名为“root”的记录,其中parent_folder就是他自己。但是我从未测试过它,也不知道系统是否会接受它。