2016-11-16 58 views
0

如何查看一个表并使用它来检查另一个表的数据完整性?交叉引用表值以允许插入

我有两个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); 

比方说,某人是不是雇员。我仍然可以将它们插入到员工表中。

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

如何防止发生这种情况。

回答

1

一种方法是有一个多余的按键:

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

然后计算列添加到员工:

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

最后,添加约束:

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

现在,你保证只有雇员在Employee表中。

+0

嘿,我试过你说的是什么,它给了我这个错误 消息1764,级别16,状态1,313线 表计算列'员工“雇员”是在“外键约束使用无效'因为它没有被持续。 消息1750,级别16,状态0,行313 无法创建约束或索引。查看以前的错误。 – Kruise