MySQL 外键级联分析
MySQL外键级联
外键介绍
在数据库中的某一张表中, 通过外键字段,可以把数据与另一张表管理起来.
我们举个例子来理解外键:
首先创建两张表,分别为Customers
和Orders
, Customers
为顾客信息表, 而Orders
作为订单表:
创建Customers
表
1 | CREATE TABLE `Customers` ( |
创建Orders
表
1 | CREATE TABLE `Orders` ( |
其中cust_id
字段作为外键联结Orders
和Customers
表, 外键绑定关系这里使用了ON DELETE CASCADE
, ON UPDATE CASCADE
, 即如果外键对应数据被删除或者更新时,将关联数据完全删除或者相应地更新.使用了插入数据后的两个表分别如下:
Customers顾客信息表
cust_id | cust_name | cust_address |
---|---|---|
1000000001 | Tom | 200 Maple Lane |
1000000002 | Jim | 1 Sunny Place |
1000000003 | John | 829 Riverside Drive |
1000000004 | Smith | 4545 53rd Street |
Orders订单表
order_id | order_data | cust_id |
---|---|---|
20005 | 2019-02-03 00:00:00 | 1000000001 |
20006 | 2019-02-07 00:00:00 | 1000000002 |
20007 | 2019-03-06 00:00:00 | 1000000003 |
外键约束
两个表必须是InnoDB表,MyISAM表暂时不支持外键.
外键列必须建立了索引, 目前MySQL5.6及以上的版本支持创建外键时自动创建索引, 所依无需显式的创建索引.
被外键引用的列必须是主键或唯一索引.
外键关系的两个表的列必须是数据类型相似, 即数据类型可以相互转换,比如
int
和tinyint
可以,而int
和char
则不可以.
根据约束, 假如我们插入Orders
表一条数据,但其中的cust_id
字段是Customers
不存在的, MySQL会提示如下错误:
1 | mysql> insert into Orders values(20006, '2019-09-03 00:00:00', '1000000006'); |
外键级联
修改外键数据
我们将Customers
表中的第一列数据进行修改:
1 | mysql> UPDATE Customers SET cust_id=1000000005 WHERE cust_name='Tom'; |
根据ON UPDATE CASCADE
,Orders
表中的对应的数据也被修改:
1 | mysql> SELECT order_num, order_date, cust_id FROM Orders; |