CREATE TABLE 语句和 ALTER TABLE 语句的 REFERENCES 子句支持 ON DELETE 子句和 ON UPDATE 子句。还可以使用“外键关系”对话框定义级联操作:

  • [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
  • [ ON UPDATE { NO ACTION / RESTRICT| CASCADE | SET NULL | SET DEFAULT } ]

PS: RESTRICT 是在更新之前限制,
      NO ACTION 是在更新之后限制,
     结果一样,判断的时间点不同

如果没有指定 ON DELETE 或 ON UPDATE,则默认为 NO ACTION。

ON DELETE NO ACTION

指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 DELETE 语句。

ON UPDATE NO ACTION

指定如果试图更新某一行中的键值,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 UPDATE 语句。

ON DELETE CASCADE

指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则也将删除所有包含那些外键的行。

ON UPDATE CASCADE

指定如果试图更新某一行中的键值,而该行的键值被其他表的现有行中的外键所引用,则组成外键的所有值也将更新到为该键指定的新值。

ON DELETE SET NULL

指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。为了执行此约束,目标表的所有外键列必须可为空值。

ON UPDATE SET NULL

指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。为了执行此约束,目标表的所有外键列必须可为空值。

ON DELETE SET DEFAULT

指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。为了执行此约束,目 标表的所有外键列必须具有默认定义。如果某个列可为空值,并且未设置显式的默认值,则将使用 NULL 作为该列的隐式默认值。因 ON DELETE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。

ON UPDATE SET DEFAULT

指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。为了执行此约束,目 标表的所有外键列必须具有默认定义。如果某个列可为空值,并且未设置显式的默认值,则将使用 NULL 作为该列的隐式默认值。因 ON UPDATE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。

例:

1.如果linecenter(主表)中的一个lid被删除了,那么引用该lid的从表中的所有记录也被删除。

通常称为级联删除

例如:

SQL> create table test (id number(7) not null, name varchar2(20),
   2   constraint pk_test primary key (id));

表已创建。

SQL> create table test1 (id number(7) not null, comments varchar(400),
   2   constraint fk_test1 foreign key (id) references test (id));

表已创建。

SQL> create table test2 (id number(7) not null, commects varchar(400),
   2   constraint fk_test2 foreign key (id) references test (id) on delete cascade);

表已创建。

SQL> insert into test values (1, 'abc');

已创建 1 行。

SQL> insert into test1 values (1, 'aaaaa');

已创建 1 行。

SQL> delete test;
delete test
*
ERROR 位于第 1 行:
ORA-02292: 违反完整约束条件 (YANGTK.FK_TEST1) - 已找到子记录日志


SQL> delete test1;

已删除 1 行。

SQL> delete test;

已删除 1 行。

SQL> insert into test values (1, 'abc');

已创建 1 行。

SQL> insert into test2 values (1, 'aaaaa');

已创建 1 行。

SQL> delete test;

已删除 1 行。

SQL> select * from test;

未选定行

SQL> select * from test2;

未选定行