Goo*_*bot 4 mysql innodb foreign-key constraint
对不起,如果这个问题很幼稚,但我无法理解 RESTRICT 或 No ACTION 的可能用法。考虑一个简单的数据库
CREATE TABLE column1
(
first_id int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (first_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci";
CREATE TABLE column2
(
second_id int(11) NOT NULL AUTO_INCREMENT,
first_id int(11) REFERENCES column1(first_id) ON DELETE CASCADE,
PRIMARY KEY (second_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci";
Run Code Online (Sandbox Code Playgroud)
DELETE FROM column1 WHERE first_id='XX'
column2(子列)中的对应行将被删除DELETE FROM column2 WHERE first_id='XX'
不会从 column1(父列)中删除任何内容对?那么,什么以及如何RESTRICT
或NO ACTION
可以改变这种情况?
在 MySQL 中,RESTRICT
和NO ACTION
是同义词:
在 MySQL 中,立即检查外键约束,因此 NO ACTION 与 RESTRICT 相同。[源代码]
现在,您要问的是,DELETE FROM column1 WHERE first_id='XX'
如果表是这样定义的,这会如何影响 a :
CREATE TABLE `column2` (
`second_id` int(11) NOT NULL AUTO_INCREMENT,
`first_id` int(11) NOT NULL,
PRIMARY KEY (`second_id`),
KEY `fk_first_id` (`first_id`),
CONSTRAINT `fk_first_id` FOREIGN KEY (`first_id`) REFERENCES `column1` (`first_id`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
注意没有ON DELETE CASCADE
orON UPDATE CASCADE
子句。该手册特别指出,通过取消此设置,您意味着RESTRICT
:
指定 RESTRICT(或 NO ACTION)与省略 ON DELETE 或 ON UPDATE 子句相同。
所以,现在当表这样定义,一个DELETE FROM column1 WHERE first_id='3'
会,如果有任何行失败column2
有一个first_id
值为3。
如果您有一个在删除值之前需要对其进行一些处理的子表,您可以使用它来确保在适当清理子表之前无法删除父表。它仍然提供对子表中孤立行的保护(孤立是存在于子表中的行,在父表中没有匹配的引用)。