SQL因外键影响而删除失败的一个解决办法
前情提要
create table a
( id varchar(8),
primary key(id)
);
create table b
( id varchar(8),
name varchar(6),
foreign key(id) references a(id),
primary key(id)
);
insert into a values('1202');
insert into a values('2320');
insert into a values('1981');
insert into a values('4390');
insert into b values('1202','alice');
insert into b values('2320','carlos');
insert into b values('1981','dem');
insert into b values('4390','ema');
问题描述
- 假如现在要删掉a表中的某条信息,因为外键影响,必须把b表中的相关信息删除之后,对a表的删除才能成功,但是我们可能并不想删除b表中的信息,怎么办呢?
解决办法
- 首先建一个b表的副本
- 注意:c的字段特点和b的一样,唯一的区别是没有外键
select *
into c
from b;
- 然后就可以删除a表中你想删除的信息了,即先删除b表中的相关信息,再对a表进行删除
后续操作
- 之后想对b表增删改查的话,应该操作b表还是它的副本c表呢?
查
- 查询c表
增
- 往b表中增添数据,并对c表进行更新
insert into c
select *
from b
where not exists( select *
from c
where c.id=b.id
and c.name=b.name
);--对c表进行更新,即插入b表有而c表没有的数据
删
- 删b表:直接删
- 删c表:需要删除b表中一样的数据,再删c表中的数据。如果不删b表中信息的话,c表再更新,又会把刚删除的数据重新添加进来
- 例如:
- 我想删除c表中id=’1202’的数据,必须把b表中id=’1202’的数据也删除,如果不这样的话,下次c表更新的话,id=’1202’的数据又会重新出现
改
- 改c表:直接改
- 改b表:先删除c表中相关的信息,然后改b表中的信息,再更新c表
- 例如:
- 我想把b表中id=’1202’的name改为‘lucky’
- 先删除c表中id=’1202’的数据
- 然后把b表中id=’1202’的name改为‘lucky’
- 然后更新c表
- 这样c表中id=’1202’的name也是’lucky’了