让我们考虑一个实际的例子。假设你有一个名为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中删除的值。
祝你好运。