MySQL: ON UPDATE CASCADE для простой таблицы «id | parent | text», не возможно? - PullRequest
1 голос
/ 27 марта 2011

У меня есть следующая таблица:

CREATE TABLE IF NOT EXISTS `Tree` (
  `id` int(10) NOT NULL,
  `parent` int(10) DEFAULT NULL,
  `text` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `parent` (`parent`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `Tree` (`id`, `parent`, `text`) VALUES
(1, 1, '1'),
(2, 1, '1.1'),
(3, 1, '1.2'),
(4, 1, '1.3');

ALTER TABLE `Tree` ADD CONSTRAINT `tree_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `tree` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

После выполнения всех вышеприведенных утверждений возникла проблема для следующего:

UPDATE  `Tree` SET  `id` =  '10' WHERE  `Tree`.`id` = 1

Хотя ожидается, что изменение основного идентификатора приведет к автоматическому обновлению всех связанных parent записей из-за ограничения ON UPDATE CASCADE. Разве не касаются эти каскадные ограничения ссылочной целостности?

1 Ответ

4 голосов
/ 27 марта 2011

Документы говорят следующее (выделение мое):

Отклонение от стандартов SQL: если ON UPDATE CASCADE или ON UPDATE SET NULL повторяется для обновления той же самой таблицыранее обновленный во время каскада, он действует как ОГРАНИЧЕНИЕ. Это означает, что вы не можете использовать операции самообращения ON UPDATE CASCADE или ON UPDATE SET NULL .Это необходимо для предотвращения бесконечных циклов, возникающих в результате каскадных обновлений.С другой стороны, возможна ссылка на ON DELETE SET NULL, как и ссылка на ON DELETE CASCADE.Каскадные операции не могут быть вложены глубиной более 15 уровней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...