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’了

猜你喜欢

转载自blog.csdn.net/qq_42689684/article/details/81702699
今日推荐