删除外键时的 CASCADE 行为

CASCADE behaviour on the drop of a foreign key

我不清楚删除指定选项 CASCADE 的 "foreign key constraint" 时会发生什么。

例如,考虑这个命令

ALTER TABLE table1 DROP CONSTRAINT foreignKeyToTable2 CASCADE.

在这种情况下选项 CASCADE 应该做什么?如果我省略它会发生什么?如果我写 RESTRICT 而不是 CASCADE?

注:此查询示例摘自"Ramez Elmasri, Shamkant B. Navathe - Fundamentals of database systems, end of chapter 5"。

只有在删除 primary 键时才需要删除约束的 cascade 选项,在删除外键时不需要。

考虑 Postgres 中的这个例子:

create table t1 (id integer, constraint pk_one primary key (id));
create table t2 (id integer primary key, id1 integer references t1);

当您尝试 运行:

alter table t1 drop constraint pk_one;

你得到:

ERROR: cannot drop constraint pk_one on table t1 because other objects depend on it
  Detail: constraint t2_id1_fkey on table t2 depends on index pk_one
  Hint: Use DROP ... CASCADE to drop the dependent objects too. 

如果你运行:

alter table t1 drop constraint pk_one cascade;

你得到:

NOTICE:  drop cascades to constraint t2_id1_fkey on table t2

告诉你,需要主键的外键也被删除了。


请注意,并非所有 DBMS 都支持级联删除。 Postgres 和 Oracle 可以。
MySQL, SQL Server 或 Firebird 没有。您需要在这些 DBMS 中手动删除外键。