外键约束
是很常用的一种保证数据完整性的约束
具体表现是: 在从表中保存主表的主键
先有的是主表 后有的是从表
比如 部门和员工
实例
创建员工表emp 编号 姓名 性别 部门编号
此时两个表之间没有任何联系
通常情况 只有存在响应的部门才能在部门中添加员工
一个部门被解散了 那么下面的员工应该更换部门或辞退
也就是说 我们希望两个表之间有一个参照 来保证数据完整
这时候 外键约束闪亮登场
给已经创建的表添加外键约束
alter table emp add foreign key(dept_id) references dept(dept_id);
此时代表emp表中的dept_id 字段参照着dept表中的dept_id
1.如果从表中有数据参照着主表的某个主键
那么这个主键对应数据 将不能直接删除
如果一定要删 先把从表对应的数据删除
后删除该主键
2.如果在从表中插入一个新的数据 那么 这个新数据的外键的值必须已经存在于主表中
当主键设置了自动增长时 就算插入语句执行失败了 主键也会增长
级联操作的作用
当主表发生update 或 delete 事件时 从表也相应的删除或更新
相应的动作有一下几种
1.CASCADE 同步更新或删除
2.NO ACTION 不允许执行更新或删除
3.SET NULL 当主表中某个主键被删除时 从表中将外键设为NULL
4.RESTRICT 拒绝主表的删除和更新操作
例:
当部门被删除时 将对应的员工一并删除
当部门编号更新时 将对应的员工一并更新
是很常用的一种保证数据完整性的约束
具体表现是: 在从表中保存主表的主键
先有的是主表 后有的是从表
比如 部门和员工
实例
创建 部门表
create table dept (
dept_id int primary key auto_increment,
dept_name char(10),
dept_manager char(10)
);
insert into dept values
(null,"财务部","张有钱"),
(null,"行政部","王大力"),
(null,"市场部","牛大迈");
创建员工表emp 编号 姓名 性别 部门编号
CREATE table emp(
emp_id int primary key auto_increment,
emp_name char(10),
emp_gender char(1),
dept_id int
);
insert into emp values
(null,"老王","男",1),
(null,"老李","男",2),
(null,"老菜","男",3);
insert into emp values
(null,"小王","女",1),
(null,"小李","女",2),
(null,"小菜","女",1);
此时两个表之间没有任何联系
通常情况 只有存在响应的部门才能在部门中添加员工
一个部门被解散了 那么下面的员工应该更换部门或辞退
也就是说 我们希望两个表之间有一个参照 来保证数据完整
这时候 外键约束闪亮登场
给已经创建的表添加外键约束
alter table emp add foreign key(dept_id) references dept(dept_id);
此时代表emp表中的dept_id 字段参照着dept表中的dept_id
1.如果从表中有数据参照着主表的某个主键
那么这个主键对应数据 将不能直接删除
如果一定要删 先把从表对应的数据删除
后删除该主键
2.如果在从表中插入一个新的数据 那么 这个新数据的外键的值必须已经存在于主表中
当主键设置了自动增长时 就算插入语句执行失败了 主键也会增长
级联操作的作用
当主表发生update 或 delete 事件时 从表也相应的删除或更新
相应的动作有一下几种
1.CASCADE 同步更新或删除
2.NO ACTION 不允许执行更新或删除
3.SET NULL 当主表中某个主键被删除时 从表中将外键设为NULL
4.RESTRICT 拒绝主表的删除和更新操作
例:
当部门被删除时 将对应的员工一并删除
当部门编号更新时 将对应的员工一并更新
CREATE table emp(
emp_id int primary key auto_increment,
emp_name char(10),
emp_gender char(1),
dept_id int
);
insert into emp values
(null,"老王","男",1),
(null,"老李","男",2),
(null,"老菜","男",3);
insert into emp values
(null,"小王","女",1),
(null,"小李","女",2),
(null,"小菜","女",1);
能不加尽量不加外键 有外键 会降低一些性能