MySQL 外键约束:何时使用 ON UPDATE 和 ON DELETE

MySQL 外键约束:何时使用 ON UPDATE 和 ON DELETE

MySQL 中,使用外键约束能够确保数据的完整性和一致性,它能够限制一个表中的数据与另一个表中的数据的关系,从而避免出现不合法的数据插入和删除。在对表进行设计时,我们可以通过定义外键约束,来使得两个表之间建立起比较严格的关联关系。在使用过程中,会有使用 ON UPDATE 和 ON DELETE 参数的情况,接下来,我们将会讲解这两个参数的使用场景。

阅读更多:MySQL 教程

什么是 ON UPDATE 和 ON DELETE

ON UPDATE 和 ON DELETE 是两个常见的外键约束参数,它们的作用是定义外键关联中当出现更新或删除操作时,希望数据库对外键关联表作何种反应。

  • ON UPDATE: 当与主表相关的数据发生更新时,子表更新时所使用的操作方式。
  • ON DELETE: 当与主表相关的数据主动删除或被动删除时,子表更新操作所使用的操作方式。

ON UPDATE 和 ON DELETE 的可选操作

ON UPDATE 和 ON DELETE 的选项有以下几个:

  • CASCADE: 级联,当主表中的数据更新或删除时,外键所关联的表的数据也会被更新或删除。具体而言,删除或更新主表数据的操作会自动删除或更新子表数据。但这种操作方式要谨慎,因为容易造成误删误改子表数据的情况。
  • SET NULL: 当主表中的数据更新或删除时,将外键值设为 NULL。这种操作方式较为安全,但会导致外键被设置为 NULL,默认的 NULL 值需要我们进行额外的处理。
  • NO ACTION: 这是默认的操作方式,当主表中的行更新或被删除时,不对从表的外键做任何处理。
  • RESTRICT: RESTRICT 经常也被称为“强制”,它会限制对父表和子表上的行进行更新和删除操作,在这里使用它等同于没有定义任何删除或更新行为。

使用 ON UPDATE 和 ON DELETE 的场景示例

以下是两个场景,分别说明 ON UPDATE 和 ON DELETE 的使用。

具体情景:

现在有两个表,第一个表的名字是 Parent,第二个表的名字是 Child,在 Child 表中,我们定义了一个外键,关联到 Parent 表的主键上。

我们在建立外键关联时,可以使用 ON UPDATE 和 ON DELETE 指定相应的操作,以此来确保子表和父表之间数据的有效性。

在以下示例中,使用 ON UPDATE 和 ON DELETE 级联更新的操作:

CREATE TABLE Parent (
 id INT NOT NULL PRIMARY KEY,
 name VARCHAR(50)
) ENGINE=INNODB;

CREATE TABLE Child (
 id INT NOT NULL PRIMARY KEY,
 parent_id INT,
 FOREIGN KEY (parent_id) REFERENCES Parent(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=INNODB;
Mysql

在这个示例中,当 parent 表中 id 字段更新或被删除时,可能会导致与其相关的 child 表数据出现不合法的情况。因此,指定使用级联更新的操作,是一种较为安全的方式。

下面是使用 ON UPDATE 和 ON DELETE 设置为 SET NULL 的操作:

CREATE TABLE Parent (
 id INT NOT NULL PRIMARY KEY,
 name VARCHAR(50)
) ENGINE=INNODB;

CREATE TABLE Child (
 id INT NOT NULL PRIMARY KEY,
 parent_id INT,
 FOREIGN KEY (parent_id) REFERENCES Parent(id) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=INNODB;
Mysql

在这个示例中,当父表中的 id 字段更新或被删除时,子表中的外键值将被设置为 NULL。在某些情况下,这是一种更合理的方式,以避免潜在故意的错误操作下,导致子表数据失去与父表之间的联系。

总结

MySQL 数据库中,使用外键约束能够确保数据的完整性和一致性。使用 ON UPDATE 和 ON DELETE 可以定义外键的更新和删除操作方式,确保子表数据与父表数据之间的有效性。在选择 ON UPDATE 和 ON DELETE 参数时,需要根据实际情况进行选择。CASCADE 和 SET NULL 都是较为常见的操作方式,但需要以业务需求为基础,谨慎使用。NO ACTION 和 RESTRICT 是默认的操作方式,可以不必额外在外键上设置。在开发过程中,合理使用外键约束和 ON UPDATE 和 ON DELETE 参数,能够有效地提升数据库的数据完整性和安全性。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册