我有一个带有布尔列automated
的表。当该字段设置为TRUE
时,另一个表需要具有引用该行的条目。
表A
id | automated
---------------------
1 | False
2 | True
3 | False
表B
id | FK-TableA | Value
-------------------------------
2 | 2 | X
因此,只要将新条目插入到automated
设置为TRUE
的表A中,那么表B中还必须插入(或存在)行,并带有引用。
答案 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
插入记录,是否需要忽略该记录?从我的角度来看,有两种选择:
TRIGGER
之前创建一个INSERT
,以相应地更新该表(创建一个PROCEDURE
来检查是否存在,并创建一个TRIGGER
执行该过程)< / li>
RULE
,以检查表B上是否存在该记录,并更改记录或不执行任何操作。更多背景知识可以帮助您使用触发器/规则。
无论如何,如果此表有很多INSERT,并且考虑到在性能上可能是一个真正的错误,并且您应该进行一些脱机操作(因为不在实时INSERT上完成),而不是在实时INSERT上进行>