外键约束(FOREIGN KEY … REFERENCES …)

Exisi 2023-01-29 14:58:24
Categories: Tags:
  • MySQL 支持外键,允许跨表交叉引用相关数据,外键约束有助于保持相关数据的一致性。

 

  • 外键关系涉及一个包含初始列值的父表,以及一个包含引用父列值的列值的子表。在子表上定义了外键约束

语法

ALTER TABLE <a_tbl_name>

    ADD [CONSTRAINT [symbol]] FOREIGN KEY

    [index_name] (<column_name>, ...)

    REFERENCES <b_tbl_name> (<column_name>,...);

    [ON DELETE reference_option]

    [ON UPDATE reference_option]

 

参数

描述

[symbol]

约束名,非字符串

<a_tbl_name>

<b_tbl_name>

数据表名

<column_name>

数据表列名

reference_option

参照动作

属性

描述

RESTRICT

拒绝父表的删除或更新操作。指定 RESTRICT(或 NO ACTION)与省略 ON DELETE ON UPDATE 子句相同。

CASCADE

从父表中删除或更新行,并自动删除或更新子表中匹配的行。支持 ON DELETE CASCADE ON UPDATE CASCADE。在两个表之间,不要定义多个作用于父表或子表中的同一列的 ON UPDATE CASCADE 子句

如果在外键关系中的两个表上都定义了 FOREIGN KEY 子句,使这两个表都成为父表和子表,则必须为另一个 FOREIGN KEY 子句定义 ON UPDATE CASCADE ON DELETE CASCADE 子句,以便进行级联操作成功。如果仅为一个 FOREIGN KEY 子句定义了 ON UPDATE CASCADE ON DELETE CASCADE 子句,则级联操作将失败并出现错误

SET NULL

从父表中删除或更新行,并将子表中的一个或多个外键列设置为NULL。同时支持ON DELETE SET NULLON UPDATE SET NULL子句

NO ACTION

来自标准 SQL 的关键字。在 MySQL 中,相当于 RESTRICT。如果引用的表中存在相关的外键值,MySQL Server 将拒绝对父表的删除或更新操作。一些数据库系统有延迟检查,NO ACTION 是延迟检查。在 MySQL 中,外键约束是立即检查的,所以 NO ACTION RESTRICT 相同

SET DEFAULT

此操作被 MySQL 解析器识别,但 InnoDB NDB 都拒绝包含 ON DELETE SET DEFAULT ON UPDATE SET DEFAULT 子句的表定义

 

示例

mysql> ALTER TABLE tb_emp2

    -> ADD CONSTRAINT fk_tb_dept1

    -> FOREIGN KEY(deptId)

    -> REFERENCES tb_dept1(id);

 

Query OK, 0 rows affected (1.38 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

 

来自 <https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html>