定义一个外键时,需要遵守下列规则:
在数据表中创建外键使用 FOREIGN KEY 关键字,具体的语法规则如下:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]其中:外键名为定义的外键约束的名称,一个表中不能有相同名称的外键;字段名表示子表被外健约束的字段名;主表名即被子表外键所依赖的表的名称;主键列表示主表中定义的主键列或者列组合。
创建父表和从表
USE test1;
#部门表--父表先创建
#主表: 可以约束其他表的字段值的表
CREATE TABLE depart(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
d_name VARCHAR(10)
);
#员工表(从表) :被约束的表,外键写在从表里面
CREATE TABLE emp(
id INT(4) PRIMARY KEY AUTO_INCREMENT,
e_name VARCHAR(10),
d_id INT(4),#这里外键列的类型要和主表的主键类型一致
#写外键约束
#定义了一个emp_dept_fk名字的外键,本表中d_id字段为外键,被参考表dept的id字段所约束
CONSTRAINT emp_dept_fk FOREIGN KEY(d_id) REFERENCES depart(id)
);父表插入数据
INSERT INTO depart (d_name) VALUES ("研发部"),("人事部");从表插入数据
#添加一个符合外键约束的数据
INSERT INTO emp (e_name,d_id) VALUES("大忽悠",1);

这里员工的d_id列的值被depart父表的主键列所约束,即从表的d_id的值必须属于父表的主键列集合里面的id值
最后一个修改解释:
例如: 部门表id为3的部门下面有员工,向把部门id的值从3改到4
1.先修改副表,先把员工表外键id=3的员工先挂到其他部门下面,解除部门表id=3和员工表外键id=3的关系
2.再修改主表,解除挂钩之后,就可以修改部门表id的值从3到4,改完之后,再把之前临时挂到其他部门的员工给再挂回到改好的部门
#添加一个符合外键约束的数据
INSERT INTO emp (e_name,d_id) VALUES("大忽悠",1);
#添加一个不符合外键约束的数据--该插入语句执行四次
INSERT INTO emp(e_name,d_id) VALUES("小朋友",10);
#添加一个符合外键约束的数据
INSERT INTO emp (e_name,d_id) VALUES("大朋友",2);
注意观察主键id自增

想要删除父表中编号为1的部门,就必须先将该部门下的所有员工删除
当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表
但是,我们希望直接修改或删除主表数据,从而影响副表数据,如删除部门表的某个部门,直接自动删除员工表中被删除部门对于的所有员工
这就是级联操作
在定义外键的时候追加以下内容:
级联修改:
ON UPDATE CASCADE
级联删除:
ON DELETE CASCADE这里选择修改表的时候,添加外键约束
alter table 表名 add [constraint 约束名] 约束类型(字段名) [外键的引用];设置级联修改和删除关系
#先将表之前的外键约束删除
ALTER TABLE emp DROP FOREIGN KEY emp_depart_fk;
#修改表时,增加外键约束和级联约束
ALTER TABLE emp ADD CONSTRAINT emp_depart_fk FOREIGN KEY(d_id) REFERENCES depart(id)
ON UPDATE CASCADE ON DELETE CASCADE;父表

从表

修改研发部的部门id,对应员工所属的部门id是否变化
UPDATE depart SET id=3 WHERE d_name="研发部";

删除研发部,看研发部下面的员工,是否被自动删除
#删除部门表中部门编号为1的部门
DELETE FROM depart WHERE id=3;
