欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多表关联删除常用方法小结

程序员文章站 2022-05-08 20:30:56
...

对于多表联合查询可能大部分开发者不会过于陌生,但是对于初学者经常会在建表时忽略主外键约束,或者没有数据库编程的经验,不会使用类似于触发器、存储过程这些。当需要对多表进行删除操作时,无外乎进行后台的多表联合查询,后台判断是否存在关联,存在关联则不删除,不存在则使用DML语言删除并返回前台结果。

现把经常用到的几个多表联合删除的方法总结如下,并附具体例子:

1.级联删除(on delete set null 、  on delete cascade)属于外键关联的一种
事例一(网络资源)
 create table a
(
id  varchar(20) primary key,
password varchar(20) not null
)

create table b
(
id int identity(1,1)  primary key,
name varchar(50) not null,
userId varchar(20),
foreign key (userId) references a(id) on delete cascade
)
表B创建了外码userId 对应A的主码ID,声明了级联删除
测试数据:
insert a values ('11','aaa')
insert a values('23','aaa')
insert b values('da','11')
insert b values('das','11')
insert b values('ww','23')
删除A表内id为‘11’的数据,发现B表内userId 为“11”也被数据库自动删除了

delete a where id='11'

 

事例二(网络资源)

 

create table dept_test
(deptno number(10) not null,
 deptname varchar2(30) not null,
 constraint pk_dept_test primary key(deptno));

create table emp_test
(empno number(10) not null,
 fname varchar2(20) ,
 lname varchar2(20) ,
 dept number(10) ,
 constraint pk_emp_test primary key(empno));

 

alter table emp_test
add constraint fk_emp_dept_test foreign key(dept) references dept_test(deptno) on delete set null;

 

insert into dept_test values(1,'销售部');
insert into dept_test values(2,'财务部');
insert into emp_test values (2,'Mary','Song',1);
insert into emp_test values (3,'Linda','Liu',2);
insert into emp_test values (4,'Linlin','Zhang',1);

 

delete from dept_test where deptno = 1;
1 row deleted.

 

SQL> select * from emp_test;
     EMPNO FNAME          LNAME                  DEPT
---------- -------------------- -------------------- ----------
     2 Mary           Song
     3 Linda          Liu                     2
     4 Linlin          Zhang

SQL> select * from dept_test;
    DEPTNO DEPTNAME
---------- ------------------------------
     2 财务部
可以看到emp_test中参照dept_test中deptno=1的两条记录对应dept值已经置为空。


 

SQL> truncate table emp_test;
Table truncated.

SQL> truncate table dept_test;
truncate table dept_test
               *
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys
此时也是禁止清空dept_test表,drop相同。


如果想要删除父表,可以有两种方法:

1、先drop子表,再drop父表。

2、先删除约束alter table emp_test drop constraint fk_emp_dept_test;,再drop父表。

2.采用存储过程(数据库开发)
 
A表:
AID   Aname                                 主健:AID
B表:
BID   BelongAID Bname               主健:BID,外健:BelongAID 
C表:
CID BelongBID Cname                  主健:CID,外健:BelongBID
D表:
DID BelongCID Dname                  主健:DID,外健:BelongCID
其中:
A表和B表通过A.AID和B.BelongAID  创建了外健关系
B表和C表通过B.BID和C.BelongBID  创建了外健关系
C表和D表通过C.CID和D.BelongCID  创建了外健关系

多表关联删除常用方法小结
            
    
    博客分类: 数据库 级联删除多表联合删除触发器存储过程 

3.采用触发器(个人喜欢用的,当然要看实际需要)

删除Text 表中的一条记录的同时删除对应记录表 relog中的记录

create trigger Text_delete on Text for delete

as

begin

delete from relog where tid = (select rid from relog)

end