删除外键时的 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 中手动删除外键。
我不清楚删除指定选项 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 中手动删除外键。