kol*_*nep 5 mysql foreign-key cascade
正如其他地方所提到的,我对 SQL 和数据库还很陌生。现在弄脏我的手并尝试所有不同的可能性。
我有一台运行 MySQL 的服务器并设置了下表进行测试:
字段类型归类属性 Null 默认额外 id mediumint(8) UNSIGNED 否 无 AUTO_INCREMENT 域 varchar(255) utf8_unicode_ci 否 无 status enum('...') utf8_unicode_ci 否 无 Replaced_by mediumint(8) UNSIGNED 是 NULL
这个想法是有一个对电子邮件有效的域列表,例如“gmail.com”和“hotmail.com”。现在,如果某个域被识别为与另一个域重复(例如“googlemail.com”到“gmail.com”),则状态列会指示这一点,而“replaced_by”列则为要使用的主域提供 ID。
此外,如果域被识别为无效(例如“gymail.com”而不是“gmail.com”),则数据库可以存储此信息,并且通过 status 和 replace_by 脚本可以建议正确的域。
虽然 ID 是该表的主键,但我想使用 ON DELETE RESTRICT 和 ON UPDATE CASCASE 测试replaced_by 列上的外键。以便replaced_by 列与主ID 保持同步。
但不知何故,当我尝试更新数据时,出现以下错误。为什么?
#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`domains`, CONSTRAINT `domains_ibfk_1` FOREIGN KEY (`replaced_by`) REFERENCES `domains` (`id`) ON UPDATE CASCADE)
Run Code Online (Sandbox Code Playgroud)
编辑 - 一些更多的细节来帮助解决这个案例:
CREATE TABLE `test`.`domains` (
`id` MEDIUMINT( 8 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`domain` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
`status` ENUM( 'valid', 'invalid', 'replace' ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
`replaced_by` MEDIUMINT( 8 ) UNSIGNED NULL ,
INDEX ( `replaced_by` ) ,
UNIQUE (
`domain`
)
ALTER TABLE `domains` ADD FOREIGN KEY ( `replaced_by` ) REFERENCES `test`.`domains` (
`id`
) ON DELETE RESTRICT ON UPDATE CASCADE ;
UPDATE `test`.`domains` SET `id` = '31' WHERE `domains`.`id` =1
#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`domains`, CONSTRAINT `domains_ibfk_1` FOREIGN KEY (`replaced_by`) REFERENCES `domains` (`id`) ON UPDATE CASCADE)
Run Code Online (Sandbox Code Playgroud)
这似乎在 innodb 中是不允许的,我认为这是您正在使用的引擎。来自 http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html:
如果
ON UPDATE CASCADE
或ON UPDATE SET NULL
递归更新它之前在级联期间更新过的同一个表,它的作用就像RESTRICT
. 这意味着您不能使用自引用ON UPDATE CASCADE
或ON UPDATE SET NULL
操作。这是为了防止级联更新导致无限循环。自引用的ON DELETE SET NULL
,在另一方面,是可能的,因为是自引用ON DELETE CASCADE
。级联操作的嵌套深度不得超过 15 级。