1

假设你有如下表,用来表示分层数据:是否可以在自参考表中的层次数据上使用约束?

+--------+-------------+ 
| Field | Type  | 
+--------+-------------+ 
| id  | int(10)  | 
| parent | int(10)  | 
| name | varchar(45) | 
+--------+-------------+ 

表是自引用,该parent_idid

所以,你可能有以下数据:

+----+--------+---------------+ 
| id | parent | name   | 
+----+--------+---------------+ 
| 1 |  0 | fruit   | 
| 2 |  0 | vegetable  | 
| 3 |  1 | apple   | 
| 4 |  1 | orange  | 
| 5 |  3 | red delicious | 
| 6 |  3 | granny smith | 
| 7 |  3 | gala   | 
+----+--------+---------------+ 

使用MySQL,我想一个(自引用)的外键在数据约束强加给级联的更新,防止删除记录它是否有任何“孩子”。

所以我用下面的:

CREATE TABLE `test`.`fruit` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `parent` INT(10) UNSIGNED, 
    `name` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`id`), 
    CONSTRAINT `fk_parent` 
    FOREIGN KEY (`parent`) 
    REFERENCES `fruit` (`id`) 
    ON UPDATE CASCADE 
    ON DELETE RESTRICT 
) 
ENGINE = InnoDB; 

据我所知,这应该符合我的要求。 (?和parent必须默认为空,以允许插入,正确的)

的问题是,如果我更改记录的id,它不会级联:

Cannot delete or update a parent row: a foreign key constraint fails (`test`.`fruit`, CONSTRAINT `fk_parent` FOREIGN KEY (`parent`) REFERENCES `fruit` (`id`) ON UPDATE CASCADE) 

我缺少什么?

随意纠正我,如果我的术语搞砸了......我是新来的约束。

回答

2

与SQL标准的偏差:如果ON UPDATE CASCADE或ON UPDATE SET NULL递归更新它在级联期间先前更新的同一个表,它就像RESTRICT那样工作。这意味着您不能使用自引用ON UPDATE CASCADE或ON UPDATE SET NULL操作。这是为了防止级联更新导致的无限循环。另一方面,可以使用自引用ON DELETE SET NULL,就像自引用ON DELETE CASCADE一样。级联操作的嵌套深度不得超过15层。

相关问题