啊超~

导航

级联操作--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来进行观测,这里就不再进行描写了

 

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

posted on 2012-12-29 02:58  啊超~  阅读(513)  评论(0编辑  收藏  举报