我已经浏览了论坛,但我似乎无法找到我正在寻找的内容。我有一个超类型,员工和三个子类型,它们引用员工的主键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
请帮助或指出我可能找到的方向!万分感谢!
答案 0 :(得分:1)
你可以使用物化视图并添加CHECK (ID=NULL)
约束,但更简单的方法可能只是在Employee表上有一个鉴别器列,例如employee_type
的有效值为('Manager', 'Server', 'Hostess')
。