mysql数据库中的级联删除和更新的设置方法

级联概念:

mysql创建的表和表之间如果存在联系,若父表的内容限制者了子表的内容选择,那么就产生了级联的概念,当父表内容产生了变化,如果产生变化的内容和子表相关联,那么子标也应该产生相应的改变。
要实现级联需要设置外键约束和主键约束,但是如果想要实现级联删除和级联更新的情况,需要注意外键约束和主键约束的实现方式。

建立主键和外键的第一种方式(不够灵活,不能实现级联,建议使用第二种)

在创建表的时候设置
(此种设置删除或更新父表内容,会报外键约束错误)

create table tb_dept
(
dno		integer not null comment '编号',
dname 	varchar(10) not null comment '名称',
dloc 	varchar(20) not null comment '所在地'
primary key (dno)    -- 设置主键
);
insert into tb_dept values 
	(10, '会计部', '北京'),
	(20, '研发部', '成都'),
	(30, '销售部', '重庆'),
	(40, '运维部', '深圳');

create table tb_emp
(
eno		integer not null comment '员工编号',
ename	varchar(20) not null comment '员工姓名',
job		varchar(20) not null comment '员工职位',
mgr		integer comment '主管编号',
sal		integer not null comment '员工月薪',
comm		integer comment '每月补贴',
dno		integer comment '所在部门编号',
primary key (eno)      --设置主键
foreign key (dno) references tb_dept(dno),       -- 设置外键
foreign key (mgr) references tb_emp(eno)      -- 设置外键
);
insert into tb_emp values 
	(7800, '张三丰', '总裁', null, 9000, 1200, 20),
	(2056, '乔峰', '分析师', 7800, 5000, 1500, 20),
	(3088, '李莫愁', '设计师', 2056, 3500, 800, 20),
	(3211, '张无忌', '程序员', 2056, 3200, null, 20),
	(3233, '丘处机', '程序员', 2056, 3400, null, 20),
	(3251, '张翠山', '程序员', 2056, 4000, null, 20),
	(5566, '宋远桥', '会计师', 7800, 4000, 1000, 10),
	(5234, '郭靖', '出纳', 5566, 2000, null, 10),
	(3344, '黄蓉', '销售主管', 7800, 3000, 800, 30),
	(1359, '胡一刀', '销售员', 3344, 1800, 200, 30),
	(4466, '苗人凤', '销售员', 3344, 2500, null, 30),
	(3244, '欧阳锋', '程序员', 3088, 3200, null, 20),
	(3577, '杨过', '会计', 5566, 2200, null, 10),
	(3588, '朱九真', '会计', 5566, 2500, null, 10);

建立主键和外键的第二种方式(可以实现级联,但是需要修改外键约束的属性)

创建表完成后设置主键和外键约束
(on delete cascade on update cascade设置完成后,删除或更新父表内容,不会报外键约束错误)

create table tb_dept
(
dno		integer not null comment '编号',
dname 	varchar(10) not null comment '名称',
dloc 	varchar(20) not null comment '所在地'
);

-- 添加有名称的主键约束,不想要这个约束可以通过这个名字删掉
-- 可以使用drop constraint删除掉
alter table tb_dept add constraint pk_dept_dno primary key(dno);

insert into tb_dept values 
	(10, '会计部', '北京'),
	(20, '研发部', '成都'),
	(30, '销售部', '重庆'),
	(40, '运维部', '深圳');

create table tb_emp
(
eno		integer not null comment '员工编号',
ename	varchar(20) not null comment '员工姓名',
job		varchar(20) not null comment '员工职位',
mgr		integer comment '主管编号',
sal		integer not null comment '员工月薪',
comm		integer comment '每月补贴',
dno		integer comment '所在部门编号',
primary key (eno)
);

-- 在设置外键约束时可以对删除和更新操作进行时的动作进行说明
-- on delete / on update
-- restrict / cascade /set null(允许为空才能使用)
-- on delete restrict on update restrict 是默认参数,表示父表相关项不能删除和更新
alter table tb_emp add constraint fk_emp_dno foreign key (dno) references tb_dept (dno) on delete restrict on update restrict;
-- 如果想要级联删除和更新可按照如下进行操作
alter table tb_emp add constraint fk_emp_dno foreign key (dno) references tb_dept (dno) on delete cascade on update cascade;
alter table tb_emp add constraint fk_emp_dno2 foreign key (mgr) references to tb_emp (eno);
drop constraint fk_emp_dno;
-- 如果想要级联删除和更新可按照如下进行操作(这里删除后伟空)
alter table tb_emp add constraint fk_emp_dno foreign key (dno) references tb_dept (dno) on delete set null on update cascade;


insert into tb_emp values 
	(7800, '张三丰', '总裁', null, 9000, 1200, 20),
	(2056, '乔峰', '分析师', 7800, 5000, 1500, 20),
	(3088, '李莫愁', '设计师', 2056, 3500, 800, 20),
	(3211, '张无忌', '程序员', 2056, 3200, null, 20),
	(3233, '丘处机', '程序员', 2056, 3400, null, 20),
	(3251, '张翠山', '程序员', 2056, 4000, null, 20),
	(5566, '宋远桥', '会计师', 7800, 4000, 1000, 10),
	(5234, '郭靖', '出纳', 5566, 2000, null, 10),
	(3344, '黄蓉', '销售主管', 7800, 3000, 800, 30),
	(1359, '胡一刀', '销售员', 3344, 1800, 200, 30),
	(4466, '苗人凤', '销售员', 3344, 2500, null, 30),
	(3244, '欧阳锋', '程序员', 3088, 3200, null, 20),
	(3577, '杨过', '会计', 5566, 2200, null, 10),
	(3588, '朱九真', '会计', 5566, 2500, null, 10);

综上:想要级联删除和更新,最好的方式为:
1:建表后再建立外键和主键。
2:修改外键的属性为cascade。

alter table tb_emp add constraint fk_emp_dno foreign key (dno) references tb_dept (dno) on delete cascade on update cascade;
alter table tb_emp add constraint fk_emp_dno2 foreign key (mgr) references to tb_emp (eno);
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值