我在PostgreSQL数据库中有一组表,称之为employee
,corporation
和account
。 corporation
有account
的外键("帐户"是"商家帐户",跨越一个或多个公司,而不是"用户帐户"就像用户登录系统一样),employee
具有corporation
的复合外键和account
的外键(它有两列:{{ 1}}和corporation_id
; account_id
的外键使用两列。
如果删除了corporation
的父employee
行,我希望其corporation
列的值设置为corporation_id
,但NULL
列应保留其值。
员工必须"属于"到帐户(account_id
为employee.account_id
),并且可以分配给该帐户中的任何(或没有)公司。如果公司被删除,分配给它的任何员工都应该取消分配(NOT NULL
设置为employee.corporation_id
),但他们仍然应该属于"到帐户(NULL
应保留其值)。
employee.account_id
的外键的 ON DELETE SET NULL
会将corporation (id, account_id)
和corporation_id
都设置为account_id
。
答案 0 :(得分:1)
似乎postgresql无法解决这个问题。
如果您只是需要能够完成工作的东西,我可以想到2个解决方法:
答案 1 :(得分:0)
我最后添加了一个额外的列到employee
(current_account_id
),该列用于corporation
的外键,DELETE SET NULL
,以及检查约束current_account_id = account_id
。只有与级联id
混淆的更改:如果account.id
发生更改,则会级联到employee.account_id
(通过employee
的外键account
)和{{1 (通过employee.current_account_id
的{{1}}的外键,通过employee
的{{1}}的外键,并且在某些时候它们是不同的(它们显然是没有原子更新),它违反了检查约束,PostgreSQL不允许这种约束。所以我将其更改为约束触发器,如果值不同则会引发corporation
,并且 可延迟(并且最初延迟)。