oracle删除定位记录后所有记录吗,Oracle - 删除家长的所有子记录

让我们考虑一个实际的例子。假设你有一个名为PARENT_TABLE表:

CREATE TABLE PARENT_TABLE

(ID_PARENT_TABLE NUMBER

CONSTRAINT PK_PARENT_TABLE

PRIMARY KEY

USING INDEX,

PARENT_ATTR_1 NUMBER,

PARENT_ATTR_2 VARCHAR2(100),

BLAH_BLAH_BLAH VARCHAR2(50));

现在让我们假设有一个名为一个子表,相当unoriginally,CHILD_TABLE:

CREATE TABLE CHILD_TABLE

(ID_CHILD_TABLE NUMBER

CONSTRAINT PK_CHILD_TABLE

PRIMARY KEY

USING INDEX,

ID_PARENT_TABLE NUMBER

CONSTRAINT CHILD_TABLE_FK1

REFERENCES PARENT_TABLE(ID_PARENT_TABLE)

ON DELETE CASCADE,

CHILD_ATTR_1 NUMBER,

WHATEVER VARCHAR2(100));

它的外键约束CHILD_TABLE_FK1这里它确实工作。当你从PARENT_TABLE中删除时,数据库注意到CHILD_TABLE_FK1引用了PARENT_TABLE(ID_PARENT_TABLE),所以数据库说:“嗯......我删除了PARENT_TABLE中有一个ID_PARENT_TABLE值为(假设)的行10 - 我想知道是否有是由CHILD_TABLE_FK1约束命名的表中的任何行,也恰好有一个ID_PARENT_TABLE值为10.那么,通过Jupiter,有!哇 - 我应该怎么做呢?约束说'ON DELETE CASCADE' - ah-ha!所以我只是删除CHILD_TABLE中那些ID_PARENT_TABLE值与我正在删除的ID_PARENT_TABLE值相匹配的那些行,并且从关系角度来说,所有这些行都与世界是正确的。现在,如果外键级联指定了ON DELETE SET NULL,那么CHILD_TABLE中与正被删除的匹配的ID_PARENT_KEY值将被设置为NULL。此外,如果您没有指定ANY ON DELETE选项,数据库将不知道该怎么做 - 您没有告诉它删除匹配的引用,并且您没有告诉它将匹配的引用设置为NULL,所以它会抛出它的手(比喻)并抛出一个异常(字面意思),因为你不能有一个父母不在那里的子键。

请注意,您可以根据需要继续此操作。比方说,你有另一台GRAND_CHILD_TABLE它引用CHILD_TABLE:当您从PARENT_TABLE删除CHILD_TABLE_FK1约束将导致CHILD_TABLE任何匹配的行删除

CREATE TABLE GRAND_CHILD_TABLE

(ID_GRAND_CHILD_TABLE NUMBER

CONSTRAINT PK_GRAND_CHILD_TABLE

PRIMARY KEY

USING INDEX,

ID_CHILD_TABLE NUMBER

CONSTRAINT GRAND_CHILD_TABLE_FK1

REFERENCES CHILD_TABLE(ID_CHILD_TABLE)

ON DELETE CASCADE,

what_EVER VARCHAR2(25));

现在,和GRAND_CHILD_TABLE_FK1约束将在GRAND_CHILD_TABLE其ID_CHILD_TABLE删除任何行值匹配从CHILD_TABLE中删除的值。

祝你好运。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值