如何添加一个引用不同表的约束



让我们假设我有表Job(JobPK INT等)Employee(EmployeePK INT, Age INT等).

我想创建另一个表A,定义为:

CREATE TABLE A
(
JobFK INT,
EmployeeFK INT,
CONSTRAINT FOREIGN KEY (JobFK) REFERENCES Job(JobPK),
CONSTRAINT FOREIGN KEY (EmployeeFK) REFERENCES Employee(EmployeePK)
)

,例如,我可以只添加年龄大于25岁的员工。

我该怎么做呢?

可以有关系约束或值约束。在一个约束条件下不可能同时拥有两者。

对于值约束,您可以在创建表时定义它,或者稍后通过ADD CONSTRAINT添加它。

例如:

CREATE TABLE Employee (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int CHECK (Age>=25)
);

你不能有一个关系约束来保证雇员的年龄大于25岁。关系约束总是适用于所有记录,而不是它的子集。

我总是在UI级别(一些验证插件)实现这些限制。

在SQL Server中可以使用

ALTER TABLE Employee  ADD CONSTRAINT CK_AGE
CHECK (Age < 80 AND Age > 25)
alter table tablename 
add fieldname datatype check(conditional expression);

的例子:

alter table A
add age smalint check(age >= 25);

最好在应用程序级别进行。然而,您可以将其实现为DB约束

CREATE TABLE Employee
(
EmployeePK INT identity(1,1) ,
Age int,
CONSTRAINT pk0 PRIMARY KEY (EmployeePK),
CONSTRAINT uk1 UNIQUE (EmployeePK, Age)
);

CREATE TABLE A
(
JobFK INT,
EmployeeFK INT,
EmployeeAge INT CHECK (EmployeeAge >=25),
CONSTRAINT fk1 FOREIGN KEY (EmployeeFK) REFERENCES Employee(EmployeePK),
CONSTRAINT fk2 FOREIGN KEY (EmployeeFK, EmployeeAge) REFERENCES Employee(EmployeePK, Age) ON UPDATE CASCADE
);

插入测试数据

insert Employee
values (30),(20);
insert A
values (100,1,30);

这个查询将会失败:

insert A
values (100,2,20);
update Employee 
set age = age-10
where age > 25;

最新更新