2012-12-11 57 views
1

我已經瀏覽了論壇,但我似乎無法找到我正在尋找的東西。我有一個超類型,員工和三個引用員工主鍵ID的子類型。員工的亞型必須是不相交的。我的問題在於我不明白在哪裏設置約束來實現這一點。亞型不相交

CREATE TABLE Employee(
ID INT, 
PRIMARY KEY(ID)); 

CREATE TABLE Manager(
ID  INT, 
Salary INT NOT NULL, 
PRIMARY KEY(ID), 
FOREIGN KEY(ID) REFERENCES Employee(ID)); 

CREATE TABLE Server(
ID  INT, 
Tips INT  NOT NULL, 
PRIMARY KEY(ID), 
FOREIGN KEY(ID) REFERENCES Employee(ID)); 

CREATE TABLE Hostess(
ID   INT, 
hourly_sal INT  NOT NULL, 
PRIMARY KEY(ID), 
FOREIGN KEY(ID) REFERENCES Employee(ID)); 

我想創建經由交叉值的視圖中的約束,那麼一個約束限制視圖的條目僅空,如下所示:

CREATE VIEW EMPLOYEE_DISJOINT AS 
((SELECT ID FROM Server)INTERSECT (SELECT ID FROM Hostess)) 
UNION 
((SELECT ID FROM Hostess) INTERSECT (SELECT ID FROM Manager)) 
UNION 
((SELECT ID FROM Server) INTERSECT (SELECT ID FROM Manager)); 


ALTER VIEW EMPLOYEE_DISJOINT 
ADD CONSTRAINT disjoint CHECK(ID = NULL); 

求在視圖中創建一個約束要求Employee中的所有主鍵對於一個且僅有一個員工子類是唯一的。有一個更好的方法嗎?雖然這種方法似乎應該工作,我得到以下錯誤:

ADD CONSTRAINT disjoint CHECK(ID = NULL) 
        * 

ERROR at line 2: 
ORA-00922: missing or invalid option 

請幫助或指向我的方向我可能會找到它!萬分感謝!

回答

1

可能使用物化視圖並添加CHECK (ID=NULL)約束,但更簡單的方法可能只是在Employee表上有一個鑑別器列, employee_type,有效值爲('Manager', 'Server', 'Hostess')