Jac*_*las 5 postgresql foreign-key postgresql-9.3 cascade
该文件说:
限制和级联删除是两个最常见的选项。RESTRICT 防止删除引用的行。NO ACTION 意味着如果检查约束时仍然存在任何引用行,则会引发错误;如果您未指定任何内容,则这是默认行为。(这两个选择之间的本质区别是 NO ACTION 允许将检查推迟到事务的后期,而 RESTRICT 不允许。) CASCADE 指定当删除引用的行时,应自动删除引用它的行以及。还有另外两个选项:SET NULL 和 SET DEFAULT。当引用的行被删除时,这些会导致引用行中的引用列分别设置为空值或它们的默认值. 请注意,这些并不能免除您遵守任何约束条件。例如,如果操作指定了 SET DEFAULT 但默认值不满足外键约束,则操作将失败。
但是没有说明on delete set null如果只有一个外键列可以为空,或者如果它只是将可空部分设置为空,是否会失败,是吗?
on delete set null如果任何外键列不接受,则不能使用null:
create schema stack;
set search_path=stack;
--
create table t1( foo integer
, bar integer
, primary key(foo,bar) );
--
create table t2( foo integer
, baz integer
, bar integer
, primary key (foo,baz)
, foreign key (foo,bar) references t1 on delete set null );
--
insert into t1 values (1,1);
insert into t2 values (1,1,1);
delete from t1;
/*
ERROR: null value in column "foo" violates not-null constraint
DETAIL: Failing row contains (null, 1, null).
CONTEXT: SQL statement "UPDATE ONLY "postgres"."t2" SET "foo" = NULL, "bar" = NULL WHERE $1 OPERATOR(pg_catalog.=) "foo" AND $2 OPERATOR(pg_catalog.=) "bar""
*/
--
drop schema stack cascade;
Run Code Online (Sandbox Code Playgroud)
也是如此on delete set default。我不知道有什么简单的方法可以解决这个问题,我不确定我是否同意这是最明智的行为,我认为更好的选择是on delete set null将可空列设置为 null 如果两者都存在。
| 归档时间: |
|
| 查看次数: |
2258 次 |
| 最近记录: |