是否可以在自引用表中对分层数据使用约束?

时间:2010-06-01 15:52:56

标签: mysql foreign-keys constraints hierarchical-data self-reference

假设您有下表,用于表示分层数据:

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

该表是自我引用的,因为parent_id指的是id

所以你可能有以下数据:

+----+--------+---------------+
| 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必须默认为null以允许插入,对吗?)

问题是,如果我更改记录的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)

我错过了什么?

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

1 个答案:

答案 0 :(得分:2)

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