让我们假设我有表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;