2016-02-25 60 views
0

注:張貼後,我添加了額外的「要求」的問題,他們在斜體通過父表列上的條件限制外鍵約束?

如何限制一個外鍵約束,以便通過鍵值強制引用一行附加條件(基於父表中的列值和子表中的一個列值)?

例如在父母和孩子表中我們有一個名爲的列已過期。如果它具有值「是」(我在下面的示例中使用值「0」和「1」)在父表中,那麼除了如果子行也具有expired ='''',那麼沒有孩子應該引用該行1'

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

基本上,如果過期在任一表中設定爲「1」,這些行應爲「忽略」,只要FK引用有關。

(我正在尋找的Oracle解決方案,但總體思路也歡迎)

MT0,你的答案是偉大的,原來的問題,謝謝。

+0

你能舉個例子嗎? – kevinsky

回答

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