DB2-数据的级联删除

来源:互联网 发布:光纤端口一收一发 编辑:程序博客网 时间:2024/06/09 18:59


数据的级联删除操作

现在有三张表: GRANDFATHER, FATHER, SON(对,没错,就是爷爷, 父亲和儿子)

  • GRANDFATHER : 李一代(id=101);
  • FATHER : 李二代1(id=201)和李二代2(id=202);
  • SON : 李三代1(id=301), 李三代2(id=302), 李三代3(id=303), 李三代4(id=304).
    表之间的关系如下:
    这里写图片描述

现在要求 : 删除表GRANDFATHER中李一代这条数据的时候, 同时将与其相关的表数据也同时删除(即:李二代和李三代等6条数据);

要达到这种目的, 比较常用的方法, 就是级联删除, 但是级联删除的前提是要有主外键关联, 所以就需要为FATHER表和SON表添加外键, 将其关联起来;
1.为FATHER表添加外键, 将其与表GRANDFATHER关联起来;
(将FATHER表的parent_id字段关联到GRANDFATHER表的id字段);

ALTER TABLE FATHER ADD CONSTRAINT FK_FATHER FOREIGN KEY (PARENT_ID) REFERENCES GRANDFATHER(ID) ON DELETE CASCADE;

2.为SON表添加外键, 将其与FATHER表关联起来;
(将SON表的parent_id字段关联到FATHER表的id字段);

ALTER TABLE SON ADD CONSTRAINT FK_SON FOREIGN KEY (PARENT_ID) REFERENCES FATHER(ID) ON DELETE CASCADE;

表数据:
GRANDFATHER表:
这里写图片描述
FATHER表:
这里写图片描述
SON表:
这里写图片描述

测试:
执行如下SQL命令, 将GRANDFATHER表中的李一代这条数据删除, 预期的效果应该是:李二代和李三代等6条数据也将同时会被删除;

DELETE FROM GRANDFATHER WHERE NAME='李一代';

测试结果正如预料;

安全隐患:
如果出现如下关系所示 , 当用同样的级联方法删除A1这条数据的时候, B1和C1也将会被同时删除; 如果此时, C1同时还被B2引用, 这种情况下,对B2和A2来说, C1被神不知鬼不觉的情况下删除了, 莫名奇妙地就消失了,出现这种问题, 应该比较头疼;
这里写图片描述
有同学问: 上图情况下, 删除C1会怎样?
无论在添加级联删除外键之前还是之后, 删除C1对其他数据都没有影响, 其他数据都将健在!

附录 : 建表语句和表数据

CREATE TABLE GRANDFATHER (ID VARCHAR(18) NOT NULL, NAME VARCHAR(20) NOT NULL, CONSTRAINT PK_YEYE PRIMARY KEY (ID));CREATE TABLE FATHER (ID VARCHAR(18) NOT NULL, NAME VARCHAR(20) NOT NULL, PARENT_ID VARCHAR(18), CONSTRAINT PK_YEYE PRIMARY KEY (ID));CREATE TABLE SON (ID VARCHAR(18) NOT NULL, NAME VARCHAR(20) NOT NULL, PARENT_ID VARCHAR(18), CONSTRAINT PK_YEYE PRIMARY KEY (ID));INSERT INTO GRANDFATHER (ID, NAME) VALUES ('101', '李一代');INSERT INTO FATHER (ID, NAME, PARENT_ID) VALUES ('201', '李二代1', '101');INSERT INTO FATHER (ID, NAME, PARENT_ID) VALUES ('202', '李二代2', '101');INSERT INTO SON (ID, NAME, PARENT_ID) VALUES ('301', '李三代1', '201');INSERT INTO SON (ID, NAME, PARENT_ID) VALUES ('302', '李三代2', '201');INSERT INTO SON (ID, NAME, PARENT_ID) VALUES ('303', '李三代3', '202');INSERT INTO SON (ID, NAME, PARENT_ID) VALUES ('304', '李三代4', '202');


by MikeSun @20170623 Fri