2016-11-16 3 views
0

1つのテーブルを見て、それを使用して別のテーブルでデータの整合性をチェックするにはどうすればよいですか?挿入を許可する別の値のクロスリファレンステーブルの値

私は2つのSQLテーブルを持っています。

人テーブルで一つ

CREATE TABLE PERSON 
(
ID    INT IDENTITY(10000,1) NOT NULL, 
Firstname  VARCHAR(15), 
Lastname  VARCHAR(25) NOT NULL, 
Birthdate  DATE, 
Gender   VARCHAR(1), 
    CHECK (GENDER IN ('M', 'F')), 
Street   VARCHAR(50), 
City   VARCHAR(15), 
State   VARCHAR(2), 
    CHECK (State IN ('FL','GA','PA')), 
Zip    INT, 
Phone   VARCHAR(10), 
Employee  VARCHAR(1), 
    CHECK (Employee IN('Y','N')), 
Member   VARCHAR(1), 
    CHECK (Member IN('Y','N')), 
    CHECK (Member IN ('Y') or Employee IN ('Y')), 

CONSTRAINT PERSON_PK PRIMARY KEY (ID)); 

と従業員表

CREATE TABLE EMPLOYEE 
(
ID    INT NOT NULL, 
Datehired  DATE DEFAULT GETDATE(), 
Status  VARCHAR(1), 
    CHECK (Status IN ('F','C')), 
Position  VARCHAR(25), 
EmpType  VARCHAR(25), 

CONSTRAINT EMPLOYEE_PK PRIMARY KEY (ID), 
CONSTRAINT EMPLOYEE_PERSON_FK FOREIGN KEY (ID) REFERENCES PERSON); 

のは、誰かが従業員ではないとしましょう。それでも私はそれらをEmployee Tableに挿入することができます。

INSERT INTO EMPLOYEE 
(ID, Status, Position, EmpType) 
    VALUES 
('10000','C','Teaching Classes','Instructor'); 

どうすればこのようなことが起こらないようにしますか?

答えて

1

一つの方法は、冗長化の鍵持っていることです:、今

alter table employee 
    add constraint fk_employee_person 
     foreign key (id, employee) references person(id, employee); 

:制約を追加、最後に

alter table employee add employee as ('Y') persisted; 

alter table person 
    contraint unq_person_id_employee 
     unique (id, employee); 

そして、従業員に計算列を追加します従業員のみがEmployeeテーブルにあることが保証されています。

+0

ねえ、私はあなたが言ったことをしようと、それは従業員が「FOREIGN KEY制約」での使用のために無効であるテーブルで私に メッセージ1764、レベル16、状態1、行313 計算列「従業員」を、このエラーが発生しましたそれは永続しないからです。 メッセージ1750、レベル16、状態0、行313 制約またはインデックスを作成できませんでした。以前のエラーを参照してください。 – Kruise

関連する問題