MySQL中的RESTRICT和NO ACTION
在MySQL中,RESTRICT和NO ACTION是两种常见的外键约束操作,它们都可以用来限制对于父表的操作。
阅读更多:MySQL 教程
RESTRICT
RESTRICT在MySQL中的作用是:如果存在父子表关联,当要在父表中删除/更新数据时,只有在父表与子表已完全匹配的情况下,才允许操作。如果不存在完全匹配的数据,MySQL将拒绝删除/更新操作,并返回错误信息。例如下面的代码:
CREATE TABLE parent
(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20) NOT NULL
);
CREATE TABLE child
(
id INT NOT NULL PRIMARY KEY,
parent_id INT NOT NULL,
name VARCHAR(20) NOT NULL,
FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE RESTRICT ON UPDATE RESTRICT
);
INSERT INTO parent(id, name) VALUES(1, 'parent1'),(2, 'parent2');
INSERT INTO child(id, parent_id, name) VALUES(1, 1, 'child1'),(2, 1, 'child2'),(3, 2, 'child3');
在上面的例子中,子表child和父表parent存在关联关系,child表中的parent_id字段是父表的主键id的外键。在删除parent表中的某一行数据时,RESTRICT将检查parent表和child表中是否存在完全匹配的行数据。如果存在,则允许删除操作;如果不存在,则拒绝删除操作,并返回错误信息。例如:
DELETE FROM parent WHERE id = 1;
由于parent表中id为1的数据与child表中的数据匹配,因此允许删除成功;但如果执行以下代码:
DELETE FROM parent WHERE id = 2;
由于parent表中id为2的数据与child表中没有匹配的数据,因此MySQL将拒绝删除操作,并返回错误信息。
NO ACTION
NO ACTION也可以用来限制对于父表的操作,不同的是,当存在父子表关系时,在父表删除/更新数据时,MySQL不会做出任何限制,也不会拒绝删除/更新操作。其具体操作效果依赖于后续的设置,例如CASCADE(级联操作)或SET NULL(置空操作)等。例如:
CREATE TABLE parent
(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20) NOT NULL
);
CREATE TABLE child
(
id INT NOT NULL PRIMARY KEY,
parent_id INT NOT NULL,
name VARCHAR(20) NOT NULL,
FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);
INSERT INTO parent(id, name) VALUES(1, 'parent1'),(2, 'parent2');
INSERT INTO child(id, parent_id, name) VALUES(1, 1, 'child1'),(2, 1, 'child2'),(3, 2, 'child3');
在上面的例子中,NO ACTION将不对父表数据的删除/更新操作做出限制。如果在删除parent表中的某一行数据时,指定使用CASCADE操作,MySQL将自动删除child表中的对应数据。例如:
ALTER TABLE child DROP FOREIGN KEY child_ibfk_1;
ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE;
DELETE FROM parent WHERE id = 1;
在删除parent表中的id为1的数据时,由于在child表中存在对应的parent_id数据,因此MySQL自动删除了child表中的对应数据。
总结
RESTRICT和NO ACTION是常见的外键约束操作,在MySQL中作用不同,需要根据实际情况进行选择,并搭配其他操作使用,以实现更高效的数据管理和操作。
极客教程