外键约束(FOREIGN KEY … REFERENCES …)

isixe 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 NULL和ON 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>