2 约束 就是用户输入超出允许范围的数据
(1)check约束:通过限制列的可接受值,强制域的完整性。通过任何基于逻辑运算符号返回true或者false的逻辑值创建check约束。
一个列可以有多个check约束,按照约束的创建顺序进行验证搜索条件必须为逻辑表达式,并且不能引用其他表列级别的check约束只能引用被约束的列,表级别的约束只能引用用一个表中的列不能再text,ntext或image上定义check约束(2)规则(Rule):执行和check相同的功能。使用check约束是限制列值的首要方法。一个列只能应用一个规则,可以应用多个check约束。check约束和表或者表的某一列绑定在一起。而规则作为数据库对象而单独存在。
Rule sample create rule chk_id as @id between 10000 and 99999gocreate table rule_sample(rule_id int primary key)gosp_bindrule chk_id, 'rele_sample.rule_id'
(3)unique约束:禁止出现重复的值如果没有为unique指定clustered或者nonclustered,默认使用nonclustered每个unique约束都会生成一个索引。unique约束的数目不会使表中的nonclustered索引超过249个,clustered索引超过1个 Code create table unique_sample(unique_column nvarchar(10) unique nonclustered)
(4)主键约束一个表只能包含一个主键约束由主键约束生成的索引不会使表中的nonclustered索引超过999个,clustered索引超过1个如果没有为主键指定clustered或者nonclustered,并且没有为unique约束指定clustered索引,主键约束将默认采用clustered主键约束定义中的所有列必须定义为not null mutiple primary key CREATE TABLE [Multiple_PK_Sample]( columnA [nvarchar](20) NOT NULL, columnB [nvarchar](20) NOT NULL, CONSTRAINT [PK_Multiple_PK_Sample] PRIMARY KEY CLUSTERED (columnA, columnB))
(5)外键约束:保证引用的完整性。确保用户输入的值存在于一个指定的表的对应的列里。
如果FK约束输入非null值,则此值必须在被引用的列中存在。FK仅能用于同一服务器上同意数据库中的表。跨数据库应用完整性必须通过触发器实现。FK可以引用同一表中的其他列,此行为成为自引用。比如AdventureWork中HumanResources.Employee的外键FK_Employee_Employee_MangerID列级别的FK只能引用一个列。两者数据类型必须相同表级别的FK的引用中列的数目比月和约束列中的列数相同,数据类型也必须相同FK约束只能引用所引用表的PK或者unique约束中的列或所引用的表中unique index中的列 Foreign Key Sample CREATE TABLE [FK_Sample]( columnA [nvarchar](20) NOT NULL, foreign key(columnA) references referencetable(columnA) )
(6)default约束:当用户未指定值是,sql server自动为其赋值 default constraint create table default_value_sample(create_date datetime default getdate())
所有的约束的完整sql
Ovarall sample -- create the class tablecreate table testing_class(class_id int primary key,class_name nvarchar(50) not null)-- create the student tablecreate table testing_student(--pkstudent_id int identity(1,1) primary key,-- check and uniquestudent_no nvarchar(50) constraint chk_no check(student_no between 10000 and 99999) unique,-- checkstudent_gendar nvarchar(6) constraint chk_gendar check(student_gendar='male' or student_gendar='female'),-- fkclass_id int foreign key(class_id) references testing_class(class_id),-- defaultcreate_date datetime default getdate())insert into testing_class (class_id, class_name) values(1, 'AAA')insert into testing_class (class_id, class_name) values(2, 'BBB')-- test the student no check constraintinsert into testing_student(student_no, student_gendar, class_id)values ('123','male','1')-- test the student gendar check constraintinsert into testing_student(student_no, student_gendar, class_id)values ('10001','xmale','1')-- test the class id check foreign constraintinsert into testing_student(student_no, student_gendar, class_id)values ('10001','male','3')-- testing the student no check unique constraint--(1)insert into one valid recordinsert into testing_student(student_no, student_gendar, class_id)values ('10001','male','1')--(2)insert into one same student no recordinsert into testing_student(student_no, student_gendar, class_id)values ('10001','female','1')