级联操作--on delete/update cascade

对于刚开始学习数据库的人群来说,想从主表删除某条记录,从表也会跟着删除的这样一系列操作并不是那么容易的

或者删除从表的记录,主表不受外键影响

通常的做法是先将从表的外键的约束进行删除

然后再分别删除想要删除或者更新的记录

 

但是这样做就比较麻烦了,删除外键之后又要重新建立外键,说不定一时大意就给忘记了

所以就可以使用级联操作的方法

 

不多话,直接上测试代码

首先建表,插入测试数据

 1  1 CREATE TABLE TA
 2  2 (
 3  3    col1 INT,
 4  4    col2 VARCHAR(12),
 5  5    CONSTRAINT T1 PRIMARY KEY(col1)
 6  6 );
 7  7 GO
 8  8 CREATE TABLE TB
 9  9 (
10 10    col3 INT,
11 11    col4 VARCHAR(12),
12 12    col5 INT,
13 13    CONSTRAINT T2 PRIMARY KEY(col3),
14 14    CONSTRAINT T3 FOREIGN KEY(col3) REFERENCES TA(col1)
15 15    ON DELETE CASCADE
16 16    ON UPDATE CASCADE
17 17 );
18 18 go
19 19 --动态SQL插入数据
20 20 declare @val int
21 21 set @val=1
22 22 while @val<=10
23 23 begin
24 24      insert into TA
25 25      select @val,'test'+cast(@val as varchar(10))
26 26 set @val=@val+1
27 27 end
28 28 go
29 29 declare @val1 int,@val2 int
30 30 set @val1=1
31 31 set @val2=5
32 32 while @val1<=10
33 33      begin
34 34           insert into TB
35 35           select @val1,'test'+convert(varchar(10),@val2),@val2
36 36      select @val1=@val1+1
37 37 end

 

然后就是进行级联操作的测试

首先先是查看数据

ta表

1 test1
2 test2
3 test3
4 test4
5 test5
6 test6
7 test7
8 test8
9 test9
10 test10

------------

tb表

1 test5 5
2 test5 5
3 test5 5
4 test5 5
5 test5 5
6 test5 5
7 test5 5
8 test5 5
9 test5 5
10 test5 5

然后是执行删除或者更新操作(这里以删除为例)

1 delete 
2 from ta
3 where col1=1

ta表和tb表的数据如下所示

2 test2
3 test3
4 test4
5 test5
6 test6
7 test7
8 test8
9 test9
10 test10

------

2 test5 5
3 test5 5
4 test5 5
5 test5 5
6 test5 5
7 test5 5
8 test5 5
9 test5 5
10 test5 5

col1为1的记录从主表和从表都已经删除掉了

如果是从从表删除会不会受主表的外键约束呢?(col3为2的为例子)

1 delete 
2 from tb
3 where col3=2

数据如下所示

3 test5 5
4 test5 5
5 test5 5
6 test5 5
7 test5 5
8 test5 5
9 test5 5
10 test5 5

证明已经被删除,并且不受主表的外键约束

如果是update操作是一样的

 

这个地方还有一个技巧,就是在外键的字段上面建立一个非聚集索引,可以提高速度

当然是要在大量数据的前提下才会显得比较有意义

这时候可以通过sql server profiler来进行观测,这里就不再进行描写了

 

以此记录学习的点点滴滴,望大家来指正不足之处~~

转载于:https://www.cnblogs.com/xuchao/archive/2012/12/29/sql.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值