Postgres 外键只有部分列的 ON DELETE SET NULL

Dru*_*rux 7 postgresql foreign-key postgresql-9.4

我在表中添加了一个(新的)第二个外键a。它的第一个外键是可选的,因此ON DELETE SET NULL对外键的约束。第二届外键是强制性的,因此(新)的约束NOT NULLa1,并a2与(新)的约束ON DELETE CASCADE外键。第二个外键还包含第一个外键的列的子集。

CREATE TABLE a
(
  a0 INTEGER NOT NULL PRIMARY KEY,
  -- other columns
  a1 INT NOT NULL,
  a2 INT NOT NULL,
  a3 INT,
  a4 INT,
  FOREIGN KEY (a1, a2)         REFERENCES b ON DELETE CASCADE,
  FOREIGN KEY (a1, a2, a3, a4) REFERENCES c ON DELETE SET NULL
);
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,我现在可以不再DELETE FROM c,因为这将无效并NOT NULL在限制a1a2。在此类删除的情况下,我希望发生的是a1, a2保持不变并a3, a4设置为NULL. 是否有简洁的语法(比使用额外的 DELETE触发器更简洁)来定义实现这一点的约束?

ype*_*eᵀᴹ 5

目前,该CASCADE操作无法仅将某些列设置为NULL. 所以我看到的唯一选择是:

  • 将所有 4 列定义为NULL并使用ON DELETE SET NULL操作。在您的情况下,这似乎不是一种选择。

  • 添加另一个表来保存这种关系(其中所有列都不可为空)并使用ON DELETE CASCADE.

  • 一个触发器。

  • 创建一个过程(Postgres 中的函数)来处理 table 的删除c。该函数将首先修改table 中的列 ( c, d) a,然后从 table 中删除c。然后你必须确保所有用户/应用程序都使用这个功能,不要直接从 table 中删除c