部分" ON DELETE SET NULL"在复合FK上

时间:2016-07-20 18:47:15

标签: postgresql foreign-keys

我在PostgreSQL数据库中有一组表,称之为employeecorporationaccountcorporationaccount的外键("帐户"是"商家帐户",跨越一个或多个公司,而不是"用户帐户"就像用户登录系统一样),employee具有corporation的复合外键和account的外键(它有两列:{{ 1}}和corporation_id; account_id的外键使用两列。

如果删除了corporation的父employee行,我希望其corporation列的值设置为corporation_id,但NULL列应保留其值。

员工必须"属于"到帐户(account_idemployee.account_id),并且可以分配给该帐户中的任何(或没有)公司。如果公司被删除,分配给它的任何员工都应该取消分配(NOT NULL设置为employee.corporation_id),但他们仍然应该属于"到帐户(NULL应保留其值)。

employee.account_id的外键的

ON DELETE SET NULL会将corporation (id, account_id)corporation_id都设置为account_id

2 个答案:

答案 0 :(得分:1)

似乎postgresql无法解决这个问题。

如果您只是需要能够完成工作的东西,我可以想到2个解决方法:

  • 使用员工和公司之间的联接附加表:
    1. 创建一个包含字段 employee_id,corporation_id,account_id 的表格。
    2. 使用DELETE
    3. 外键(employee_id,account_id)参考员工(corporation_id,account_id)参考公司 CASCADE
    4. 如果员工只需要在一家公司 - 在(employee_id,account_id)上添加唯一约束
    5. 最后,不会使用员工表中的corporation_id
  • 或从联接中删除account_id并使用触发器验证公司account_id与员工account_id相同

答案 1 :(得分:0)

我最后添加了一个额外的列到employeecurrent_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,并且 可延迟(并且最初延迟)。