在父表列上按条件限制外键约束?

时间:2016-02-25 20:33:16

标签: oracle foreign-keys

注意:发布后我添加了额外的"要求"对于这个问题,他们是斜体

如何限制外键约束,以便通过键值强制引用行一个附加条件(基于父表中的列值和子表中的列) )?

例如,在父和子表中,我们有一个名为 expired 的列。如果它有值"是" (我在父表中使用了值' 0'以及' 1' ,那么没有孩子应该引用该行除外如果子行也已过期=' 1'

示例:http://sqlfiddle.com/#!15/33931/1

基本上,如果已过期设置为' 1'在任何一个表中,这些行应该被忽略"就FK参考而言。

(我正在为Oracle寻找解决方案,但也欢迎一般的想法)

MT0,您的回答非常适合原始问题,谢谢。

1 个答案:

答案 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