如何实现关系表的级联删除(ON DELETE CASCADE的用法)
转自:http://hi.baidu.com/pingfandexiake/blog/item/b74c0e3631f2f3daa3cc2bcf.html 以下面两张表为例:SQL> desc person PERSONID NOT NULL NUMBER(9) SQL> desc PERSONPROFESSION PROFESSIONID NOT NULL NUMBER(2) 假定PERSONPROFESSION为父表,PERSON为子表,建立如下约束条件: SQL>ALTER TABLE PERSONPROFESSION ADD (CONSTRAINT PK_PERSONPROFESSION PRIMARY KEY (PROFESSIONID) USING INDEX TABLESPACE WACOS; 表已更改。 SQL>ALTER TABLE PERSON ADD (CONSTRAINT PK_PERSON PRIMARY KEY (PERSONID) USING INDEX TABLESPACE WACOS; 表已更改。 增加PERSON表的外键约束: SQL>ALTER TABLE PERSON ADD (CONSTRAINT FK_PERSON1 FOREIGN KEY (PROFESSION) 表已更改。 分别向两张表里插入一行数据: SQL>insert into PERSONPROFESSION values('1','sdfd','df','342','dfs'); 已创建 1 行。 SQL> commit; 提交完成。 SQL>insert into person values('10','1','dsf','d','d','df','df','0','','sd','s','11','11'); 已创建 1 行。 SQL> commit; SQL> select PERSONID,PROFESSION from person; PERSONID PROFESSION SQL> select PROFESSIONID,name from PERSONPROFESSION; PROFESSIONID NAME SQL> delete from PERSONPROFESSION; 报错是因为父表里存在子表的记录,应先删除子表记录,再删除父表记录: SQL> delete from PERSON; 已删除 1 行。 SQL> delete from PERSONPROFESSION; 已删除 1 行。 SQL> commit; 提交完成。 那么,如何实现两张表的级连删除呢? 重新建立PERSON的外键,加上ON DELETE CASCADE选项试一下: SQL> alter table person drop CONSTRAINT FK_PERSON1; 表已更改。 SQL>ALTER TABLE PERSON ADD (CONSTRAINT FK_PERSON1 FOREIGN KEY (PROFESSION)
已删除 1 行。 SQL> select PERSONID,PROFESSION from person; PERSONID PROFESSION SQL> select * from PERSONPROFESSION; 未选定行 以上可以看出父表记录删除了,子表记录还存在。 那么在delete语句的末尾加上CASCADE,就可以实现两张表的级删除: SQL> delete from PERSONPROFESSION cascade; 已删除 1 行。 SQL> select * from person; 未选定行 SQL> select * from PERSONPROFESSION; 未选定行
ON DELETE NO ACTION(default) CASCADE SET NULL |