个人理解,有误请指出。


章节目录

  • 语法
  • 约束
  • 概念
  • 示例
  • 设置为RESTRICT
  • 设置为CASCADE
  • 设置为SET NULL
  • 注意事项
  • 创建外键
  • 删除外键


语法

ALTER TABLE 子表 
ADD CONSTRAINT 外键名 
FOREIGN KEY (子表列) 
REFERENCES 主表名(主表列) 
ON DELETE + 约束
ON UPDATA + 约束 ;

注明:
外键名:自己设置,仅仅只是别名,这里有人会认为是关键字。
约束:在语法添加,约束名不同,作用不同,下面单独说。

约束

概念

navicat for mysql中设置外键

MySQL 外键 多个字段名 mysql外键名称有什么用_外键


上面语法中在ON DELETE 和 ON UPDATA后面的+约束 ,下面是不同约束的功能

  • CASCADE:主表delete或update数据时,子表对应的数据也会被删除或更新。
  • SET NULL:主表delete或update数据时,子表的对应数据会被变为null。
  • RESTRICT:如果主表想要delete、update数据,但是子表的外键列中有对应的数据,那么主表中的数据不可以被删除。
    通俗的说:子表有数据,主表无法更改。
  • NO ACTION:和RESTRICT作用差不多,现在mysql最新版本已经无法选择了。

示例

删除和更新的约束作用一样,这里只演示删除。

主表:eastchina

MySQL 外键 多个字段名 mysql外键名称有什么用_数据库_02


子表:city

MySQL 外键 多个字段名 mysql外键名称有什么用_mysql优化_03

设置为RESTRICT

MySQL 外键 多个字段名 mysql外键名称有什么用_外键_04


MySQL 外键 多个字段名 mysql外键名称有什么用_数据库_05


MySQL 外键 多个字段名 mysql外键名称有什么用_mysql_06


结果:无法删除。

设置为CASCADE

MySQL 外键 多个字段名 mysql外键名称有什么用_mysql_07


MySQL 外键 多个字段名 mysql外键名称有什么用_数据库_08


MySQL 外键 多个字段名 mysql外键名称有什么用_外键_09


结果:主表数据删除,子表也会被删除。

设置为SET NULL

MySQL 外键 多个字段名 mysql外键名称有什么用_数据库_10


MySQL 外键 多个字段名 mysql外键名称有什么用_MySQL 外键 多个字段名_11

MySQL 外键 多个字段名 mysql外键名称有什么用_数据库_12


结果:主表删除数据,子表外键列变为null。

注意事项

创建外键

1.子表并非只能设置在主表的主键上,但是必须是唯一性索引。通常都设置在主键。
2.子表外键列的字段类型需要和主表的主键保持一致性。
3.如果约束需要设置为SET NULL 时,那么子表的外键列不可以设置为not null。
4.外键必须使用相同的存储引擎,mysql的默认存储引擎是innodb,所以可以不用管它。
5.主表的主键如果是无符号或者自动递,那么外键就不会增加成功。

删除外键

注意:外键不支持修改,只能删了重建

删除:ALTER  TABLE  外键表名  DROP  FOREIGN  KEY  外键名