DB2-数据的级联删除

本文介绍了在DB2数据库中实现数据级联删除的操作步骤和注意事项。通过创建外键关联GRANDFATHER、FATHER和SON三张表,实现删除GRANDFATHER表中的记录时,同时删除相关联的FATHER和SON表记录。文章通过实例演示了级联删除的过程,并讨论了可能存在的安全隐患及其影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



数据的级联删除操作

现在有三张表: 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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值