2014-01-13 15 views
1

是否有可能在表上添加外鍵約束,這將允許在另一個表中不存在的值?是否有可能使用「NOT IN」邏輯創建外鍵約束

在下面的示例中,兩個表都包含字段USER_ID。約束條件是客戶和員工不能具有相同的USER_ID值。

我在添加新表格或以任何方式更改其中一個表格方面非常有限。

CUSTOMER 
-------------------------- 
USER_ID  varchar2(10) 

EMPLOYEE 
-------------------------- 
USER_ID  varchar2(10) 

我想幾個解決方法,如其中含有兩個表中或添加在桌子上我可以修改的插入觸發數據的圖。

+1

聽起來像你的數據模型搞砸了。這不是FK。 FK將是一個表中與另一個表中的字段相關的字段。在這裏你只需要有兩個互相排斥的IDS。 – OldProgrammer

+0

是來自USER表的user_id? (這意味着員工不能成爲客戶?) – tbone

回答

0

除非您願意按照其他人的建議更改數據模型,否則在保持互斥的情況下繼續使用現有結構的最簡單方法是對兩個表的user_ids發出檢查約束,以便它們僅驗證相互驗證獨家系列。

例如,您可以發出檢查以確保只有偶數號碼分配給客戶,而奇數號碼給員工(反之亦然)。或者,由於兩個IDS都是varchar,因此使用您的檢查約束規定ID以一個已知子字符串開頭,例如'EMP'或'CUST'。

但這些只是技巧,幾乎沒有關係。理想情況下,可以修改數據模型。希望這可以幫助。

1

不,沒有這樣的東西存在,雖然它有可能是假的。

如果要關聯地執行此操作(這將比視圖/觸發器好很多),最簡單的方法是將E添加到所有員工ID並將C添加到所有客戶ID。但是,如果您有其他屬性並且您想確保它們不是同一個人(即您不只是對該ID感興趣),則這將不起作用。

如果這是你需要創建第三個表的情況下,讓我們把它的人:

create table people ( 
    user_id varchar2(10) not null 
, user_type varchar2(1) not null 
, constraint pk_people primary key (user_id) 
, constraint chk_people_user_types check (user_type in ('C','E')) 
    ); 

C會站在客戶和E在檢查約束員工。然後,您需要創建人唯一索引/約束:

create index ui_people_id_type on people (user_id, user_type); 

個人而言,我停在這裏完全放下你的客戶和員工表;他們不再有任何用處,你的問題已經解決。

如果您無法添加新的列/表格,您需要與所做的並說服他們改變它的人說話。過度複雜的事情只會導致邏輯錯誤和混淆(相信我 - 使用視圖意味着需要大量觸發器來維護表格,並且必須確保只有人更新視圖)。即使花費更長時間,做事情也會更容易。


但是,如果你真的想繼續你改變你的客戶和員工的表格,包括他們的USER_TYPE,並確保它總是在表,即每行的相同:

alter table customers add user_type default 'C' not null; 
alter table customers add constraint chk_customers_type 
     check (user_type is not null and user_type = 'C');