Postgres检查如果字段为True,

时间:2018-10-12 09:49:07

标签: postgresql constraints

我有一个带有布尔列automated的表。当该字段设置为TRUE时,另一个表需要具有引用该行的条目。

表A

     id    |   automated
    ---------------------
     1     |       False
     2     |       True
     3     |       False

表B

     id    |  FK-TableA   |  Value
     -------------------------------
     2     |       2      |   X

因此,只要将新条目插入到automated设置为TRUE的表A中,那么表B中还必须插入(或存在)行,并带有引用。

2 个答案:

答案 0 :(得分:1)

这很丑陋,并在数据库中引入了冗余,但是我想不到一个比这更好的方法:

  • b_id中引入新列a

  • UNIQUE上向("FK-TableA", id)添加b约束。

  • a上添加外键,以便(id, b_id) REFERENCES b("FK-TableA", id)

  • CHECK (b_id IS NOT NULL OR NOT automated)上添加a约束。

然后,您必须将b_id指向b中指向该a行的一行。

要使其完美,您必须添加触发器,以确保每次修改后两个外键仍然保持一致。

我告诉你这很丑!

答案 1 :(得分:1)

对我来说,这似乎是不自然的流程,您要说明自然流程应该在表B上创建一个TRIGGER,每当插入新的表B记录时就在表A上插入一条记录。

但是我知道这是一个更加复杂的问题的简化,因此,如果您确实需要创建这种过程,那么仍然有一个问题需要回答,当检查为负时会发生什么,是否应该有例外?应该用FALSE而不是TRUE插入记录,是否需要忽略该记录?从我的角度来看,有两种选择:

  1. 在表A的TRIGGER之前创建一个INSERT,以相应地更新该表(创建一个PROCEDURE来检查是否存在,并创建一个TRIGGER执行该过程)< / li>
  2. 在表A的插入位置创建一个RULE,以检查表B上是否存在该记录,并更改记录或不执行任何操作。

更多背景知识可以帮助您使用触发器/规则。

无论如何,如果此表有很多INSERT,并且考虑到在性能上可能是一个真正的错误,并且您应该进行一些脱机操作(因为不在实时INSERT上完成),而不是在实时INSERT上进行