注意:发布后我添加了额外的"要求"对于这个问题,他们是斜体。
如何限制外键约束,以便通过键值强制引用行一个附加条件(基于父表中的列值和子表中的列) )?
例如,在父和子表中,我们有一个名为 expired 的列。如果它有值"是" (我在父表中使用了值' 0'以及' 1' ,那么没有孩子应该引用该行除外如果子行也已过期=' 1' 。
示例:http://sqlfiddle.com/#!15/33931/1
基本上,如果已过期设置为' 1'在任何一个表中,这些行应该被忽略"就FK参考而言。
(我正在为Oracle寻找解决方案,但也欢迎一般的想法)
MT0,您的回答非常适合原始问题,谢谢。
答案 0 :(得分:1)
使用具有唯一约束的虚拟列:
CREATE TABLE PARENTS (
id INT PRIMARY KEY,
valid INT CHECK ( valid IN (0,1) ),
valid_id INT GENERATED ALWAYS AS ( CASE valid WHEN 1 THEN id END )
UNIQUE
);
CREATE TABLE Children (
id INT PRIMARY KEY,
parent_id INT REFERENCES Parents ( valid_id )
);
如果你这样做:
INSERT INTO parents ( id, valid ) VALUES ( 1, 1 );
INSERT INTO parents ( id, valid ) VALUES ( 2, 0 );
INSERT INTO Children ( id, parent_id ) VALUES ( 1, 1 );
插入工作但是这个:
INSERT INTO Children ( id, parent_id ) VALUES ( 2, 2 );
结果:
SQL Error: ORA-02291: integrity constraint (TEST.SYS_C009124) violated - parent key not found