2014-11-21 66 views
0

考慮下面的設計:對數據的Oracle參照完整性範圍PK臺

LEGAL_CASE table (columns) 
-------------------------------- 
LEGAL_CASE_ID 
APPELLATE_CRT_ID 
DISTRICT_CRT_ID 
TRIAL_CRT_ID 

與所有法院在查找表

COURT table (data) 
-------------------------------------------- 
CRT_ID  CRT_TYPE  CRT_NAME 
-------------------------------------------- 
1   A    APPELLATE COURT 1 
2   A    APPELLATE COURT 2 
3   D    DISTRICT COURT 1 
4   D    DISTRICT COURT 2 
5   T    TRIAL COURT 1 
6   T    TRIAL COURT 2 

做它的標準方式來定義,我想,應該爲每種法院類型分別設置一個查詢表,但我更願意將它們全部放在一個代碼中,以便使用緊湊和高雅。那麼我希望有某種形式的參照完整性約束(如果上面的規則出FK),將強制所有可以進入APPELLATE_CRT_ID的形式都是來自COURT表的CRT_ID值,但只有在CRT_TYPE ='A' etc 。一個普通的FK可以允許Ds和Ts,但是我想使它更具限制性。

有沒有一種方法來制定一個限制主鍵表中值的範圍的FK,或者我應該去RULE或其他類型的CONSTRAINT

回答

1

如果您希望查詢表具有引用完整性,則需要將多個CRT_TYPE列添加到legal_case表中,並將這些列作爲外鍵的一部分包含在內。像

CREATE TABLE legal_case (
    legal_case_id  integer primary key, 
    appellate_crt_id integer, 
    appellate_crt_type varchar2(1), 
    district_crt_id integer, 
    district_crt_type varchar2(1), 
    ... 
    constraint fk_appelate_crt foreign key (appelate_crt_id, appellate_crt_type) references court(crt_id, crt_type), 
    constraint fk_district_crt foreign key (district_crt_id, district_crt_type) references court(crt_id, crt_type), 
    ... 
); 

當然了什麼,這將要求court表的主鍵(或唯一約束,雖然我不喜歡引用NNO-主鍵外鍵)將crt_id, crt_type而不僅僅是crt_id

否則,你會看寫觸發器來驗證這種事情(如果你想阻止會話A修改court行,而會話B有未提交的變化取決於現有的狀態該行),或者可能創建具有合適的一組約束的實體化視圖,這些約束組合來自這兩個表的數據。

+0

'appellate_crt_type'在'legal_case'中始終是相同的值。這是多餘的。我不喜歡那樣。我可以有一個規則,在'appellate_crt_id'中將可接受的值範圍定義爲'SELECT CRT_ID FROM COURT WHERE CRT_TYPE ='A''? – amphibient 2014-11-21 18:30:42

+0

@amphibient - 是的,這是多餘的。但是,鑑於你想要構建「法庭」表,這是獲得參照完整性的唯一方法。這就是爲什麼在這種情況下我更喜歡不同的查詢表。不,您不能創建一個約束來驗證基於對某個其他表的查詢的一個表中的數據。 – 2014-11-21 18:34:19