子类型不相交

时间:2012-12-11 05:34:00

标签: sql oracle10g

我已经浏览了论坛,但我似乎无法找到我正在寻找的内容。我有一个超类型,员工和三个子类型,它们引用员工的主键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 

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

1 个答案:

答案 0 :(得分:1)

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