Предположим, у вас есть следующая таблица, предназначенная для представления иерархических данных:
+--------+-------------+
| 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)
Чего мне не хватает?
Не стесняйтесь поправлять меня, если моя терминология испорчена ... Я новичок в ограничениях.