MySQL中的RESTRICT和NO ACTION

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中作用不同,需要根据实际情况进行选择,并搭配其他操作使用,以实现更高效的数据管理和操作。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程