1

フォーラムを調べましたが、探しているものを正確に見つけることができないようです。スーパータイプの従業員と、従業員の主キー ID を参照する 3 つのサブタイプがあります。従業員のサブタイプは互いに素でなければなりません。私の問題は、これを実現するための制約をどこに置くべきかわからないという点で発生します。

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

従業員のすべての主キーが従業員の唯一のサブタイプに固有であることを要求するビューに制約を作成しようとしています。これを行うより良い方法はありますか?この方法は機能するはずですが、次のエラーが発生します。

ADD CONSTRAINT disjoint CHECK(ID = NULL)
                  *

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

助けてください、または私が見つけたかもしれないどこかの方向に私を向けてください! ありがとうございます!

4

1 に答える 1

1

マテリアライズド・ビューを使用して制約を追加することもできCHECK (ID=NULL)ますが、より簡単な方法は、たとえばemployee_type有効な値を使用して、Employeeテーブルに判別列を設定することです('Manager', 'Server', 'Hostess')

于 2012-12-12T05:43:26.833 に答える