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

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

  • 相关阅读:
    理解 QEMU/KVM 和 Ceph(2):QEMU 的 RBD 块驱动(block driver)
    Neutron VxLAN + Linux Bridge 环境中的网络 MTU
    理解 QEMU/KVM 和 Ceph(1):QEMU-KVM 和 Ceph RBD 的 缓存机制总结
    [译] 企业级 OpenStack 的六大需求(第 3 部分):弹性架构、全球交付
    [译] 企业级 OpenStack 的六大需求(第 2 部分):开放架构和混合云兼容
    [译] 企业级 OpenStack 的六大需求(第 1 部分):API 高可用、管理和安全
    Javascript中的Array(数组) 、{}(映射) 与JSON解析
    HTML中显示特殊字符,如尖括号 “<”,">"等等
    Ubuntu 12.04 安装配置 Apache2
    Python中函数的参数传递与可变长参数
  • 原文地址:https://www.cnblogs.com/xuchao/p/sql.html
Copyright © 2020-2023  润新知