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   c on straint pk_test primary key (id));
    表已创建。
    SQL> create table test1 (id number(7) not null, comments varchar(400),
    2   c on straint fk_test1 foreign key (id) references test (id));
    表已创建。
    SQL> create table test2 (id number(7) not null, commects varchar(400),
    2   c on straint 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;