MySQL之外键约束(FOREIGN KEY)

Posted 小白不再菜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL之外键约束(FOREIGN KEY)相关的知识,希望对你有一定的参考价值。

定义:

mysql外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。

外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值。

外键是表的一个字段,不是本表的主键,但对应另一个表的主键。定义外键后,不允许删除另一个表中具有关联关系的行。

外键的主要作用是保持数据的一致性、完整性。例如,部门表 tb_dept 的主键是 id,在员工表 tb_emp5 中有一个键 deptId 与这个 id 关联。

  • 主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表。
  • 从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表。

外键约束字段的选取:

定义一个外键时,需要遵守下列规则:

  • 父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
  • 必须为父表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  • 在父表的表名后面指定列名或列名的组合。这个列或列的组合必须是父表的主键或候选键。
  • 外键中列的数目必须和父表的主键中列的数目相同。
  • 外键中列的数据类型必须和父表主键中对应列的数据类型相同。

设置外键约束:

1、创建表时添加外键约束

语法规则如下:

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]

其中:<外键名>为定义的外键约束的名称,一个表中不能有相同名称的外键;<字段名>表示子表需要添加外健约束的字段列;<主表名>即被子表外键所依赖的表的名称;<主键列>表示主表中定义的主键列或者列组合。

【实例 1】创建一个名为test_dept1的表作为父表

 

 

 

 

 

 

 

 

创建数据表 tb_emp6,并在表 tb_emp6 上创建外键约束,让它的键 deptId 作为外键关联到表 tb_dept1 的主键 id

 

 

 

 

 

 

 

 

 

 fk_emp_dept1 为外键约束,外键名称为 deptId,其依赖于表 tb_dept1 的主键 id。

提示:关联指的是关系数据库中,相关表之间的联系。它是通过相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则创建子表时会出现错误“ERROR 1005(HY000):Can\'t create table\'database.tablename\'(errno:150)”。

2、在修改数据表时添加外键约束

语法规则为:

ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);

【实例 2】修改数据表 tb_emp3,将字段 deptId 设置为外键,与数据表 tb_dept1 的主键 id 进行关联

 

 

 同一个数据库中的外键约束名称不能重复,否则会报错

 

 

删除外键约束:

 对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主表和从表间的关联关系,MySQL 中删除外键的语法格式如下:

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

【实例 3】删除数据表 tb_emp3 中的外键约束 fk_em_dept1

删除前:

 

 

 

 

 删除后:

 

 

 

 

 tb_emp3 中已经不存在 FOREIGN KEY,原有的名称为 fk_emp_dept 的外键约束删除成功。

 

以上是关于MySQL之外键约束(FOREIGN KEY)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL外键约束-foreign key

MySQL外键约束-foreign key

mysql启动和关闭外键约束的方法(FOREIGN_KEY_CHECKS)

oracle为表建立外键时没有命名FOREIGN KEY约束,现在想删外键怎么办??

MySQL 如何删除有外键约束的表数据

SET GLOBAL FOREIGN_KEY_CHECKS取消外键约束