个人理解,有误请指出。
章节目录
- 语法
- 约束
- 概念
- 示例
- 设置为RESTRICT
- 设置为CASCADE
- 设置为SET NULL
- 注意事项
- 创建外键
- 删除外键
语法
ALTER TABLE 子表
ADD CONSTRAINT 外键名
FOREIGN KEY (子表列)
REFERENCES 主表名(主表列)
ON DELETE + 约束
ON UPDATA + 约束 ;
注明:
外键名:自己设置,仅仅只是别名,这里有人会认为是关键字。
约束:在语法添加,约束名不同,作用不同,下面单独说。
约束
概念
navicat for mysql中设置外键
上面语法中在ON DELETE 和 ON UPDATA后面的+约束 ,下面是不同约束的功能
- CASCADE:主表delete或update数据时,子表对应的数据也会被删除或更新。
- SET NULL:主表delete或update数据时,子表的对应数据会被变为null。
- RESTRICT:如果主表想要delete、update数据,但是子表的外键列中有对应的数据,那么主表中的数据不可以被删除。
通俗的说:子表有数据,主表无法更改。 - NO ACTION:和RESTRICT作用差不多,现在mysql最新版本已经无法选择了。
示例
删除和更新的约束作用一样,这里只演示删除。
主表:eastchina
子表:city
设置为RESTRICT
结果:无法删除。
设置为CASCADE
结果:主表数据删除,子表也会被删除。
设置为SET NULL
结果:主表删除数据,子表外键列变为null。
注意事项
创建外键
1.子表并非只能设置在主表的主键上,但是必须是唯一性索引。通常都设置在主键。
2.子表外键列的字段类型需要和主表的主键保持一致性。
3.如果约束需要设置为SET NULL 时,那么子表的外键列不可以设置为not null。
4.外键必须使用相同的存储引擎,mysql的默认存储引擎是innodb,所以可以不用管它。
5.主表的主键如果是无符号或者自动递,那么外键就不会增加成功。
删除外键
注意:外键不支持修改,只能删了重建
删除:ALTER TABLE 外键表名 DROP FOREIGN KEY 外键名