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));

我想通过相交值的视图创建约束,然后将视图的条目限制为 null 的约束,如下所示:

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 

请帮助或指出我可能找到它的方向!万分感谢!

4

1 回答 1

1

可以使用物化视图并添加CHECK (ID=NULL)约束,但更简单的方法可能是在 Employee 表上有一个鉴别器列,例如employee_type使用有效值('Manager', 'Server', 'Hostess')

于 2012-12-12T05:43:26.833 回答