在 FOREIGN KEY 约束中使用 RESTRICT 或 No ACTION

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)
  1. 如果DELETE FROM column1 WHERE first_id='XX'column2(子列)中的对应行将被删除
  2. 如果DELETE FROM column2 WHERE first_id='XX'不会从 column1(父列)中删除任何内容

对?那么,什么以及如何RESTRICTNO ACTION可以改变这种情况?

Der*_*ney 6

在 MySQL 中,RESTRICTNO 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 CASCADEorON UPDATE CASCADE子句。该手册特别指出,通过取消此设置,您意味着RESTRICT

指定 RESTRICT(或 NO ACTION)与省略 ON DELETE 或 ON UPDATE 子句相同。

所以,现在当表这样定义,一个DELETE FROM column1 WHERE first_id='3'会,如果有任何行失败column2有一个first_id值为3。

如果您有一个在删除值之前需要对其进行一些处理的子表,您可以使用它来确保在适当清理子表之前无法删除父表。它仍然提供对子表中孤立行的保护(孤立是存在于子表中的行,在父表中没有匹配的引用)。