SQL Server数据库采用的是关系数据模型,而关系数据模型本身的优点之一就是模型本身集成了数据完整性。作为模型一部分而实施的数据完整性(例如在创建数据表时的列属性定义)称作为声明式(Declarate)数据完整性。用代码来实施的数据完整性(例如存储过程、触发器等)称为过程式(procedural)数据完整性。
以下介绍几种声明式约束概要知识:
一:主键约束(Primary Key Constraints)
主键约束实施行的唯一约束,同时不允许行的属性为null值。约束属性中,每一记录行只能在数据表中出现一次。换而言之,表内的每行数据可以被唯一确定。
约束的创建:
1:主键约束只能在数据表中创建一次;
2:不能再属性为允许NULL值得列上创建主键约束。
创建方法:
1:创建表时在数据列上声明
create table temp1 (row_id int identity(1,1) not null primary key);
2:创建表后增加约束
alter table temp1 add constraint PK_temp1 primary key(row_id );
为了实施逻辑主键的唯一约束,SQL Server 会在后台创建一个唯一索引(Unique Index)。唯一索引是SQL Server实施唯一约束而采用的一种物理机制。
二:唯一约束(Unique Constraints)
唯一约束用来保证数据行的一个列(或一组列)数据的唯一。
约束的创建:
1:与主键约束不同,同一张数据表上可以创建多个唯一约束;
2:唯一约束可以定义在NULL值列上;
3:目前SQL Server 只支持在唯一约束列中,只能有一个列为NULL值列
创建方法:
alter table temp1 add constraint UC_temp1 unique (row_id);
与主键约束一样,在创建唯一约束后,SQL Server会创建唯一索引以实施逻辑唯一约束的物理机制。
三:外键约束(Foreign Key Constraints)
外键约束用于实施引用完整性。外键约束在引用表(referencing table )的一组属性上进行定义,且指向被引用表(referenced table)中的一组候选键(主键或唯一约束)。外键约束的目的是将外键列的值域控制在被引用列中现有的值。
约束的创建:
1:引用表和被引用表可以是同一张数据表;
2:即使被引用的候选键不允许NuLL值,在外键中也可以允许为NULL值;
3:可以在引用表上定义具有级联功能的外键。其目的是,当在对被引用表中的数据行进行删除(Delete)或更新(Update)操作时,可以自动对引用表中自动进行删除(Delete)或更新(Update)相关的数据行。
创建方法:
例如:在表A的ID列上定义一个外键约束,让它指向表B中的row_id 列
Alter table A add constraint FK_A_ID Foreign key (ID) references B(row_id) [on delete cascade on update cascade];
注:on delete 和 on update 为可选的定义选项,可定义的操作分为 CASCADE、Set Default、Set Null三种。
cascade:操作(更新或删除)将被级联到引用表中相关数据行;
set default:将更新引用表中相关数据行的值为默认值;
set null:将更新引用表中相关数据行的值为null值
外键约束实施的引用操作成为“禁止操作(no action)”。禁止操作的含义为:当试图删除被引用表中的数据行或更新被引用表中的候选键时,如果在引用表中存在相关的数据行,则不允许此操作执行。
四:检查约束(Check Constraint)
检查约束用于定义在表中插入或更新一行数据之前必须满足的一个谓词(Check Expression) 。
约束的创建:
当谓词返回的逻辑结果为False时,SQL Server将阻止本次对数据表的新增或更新操作;当谓词返回的逻辑结果为TRUE或者UNknown时,本次操作通过。
创建方法:
Alter table temp1 add constraint CK_temp1 check (row_id <10000); ----检查数据列 row_id,使其值不能大于10000
五:默认约束(Default Constraint)
默认约束用来设置数据列的默认值。当对数据表新增一行记录时,如果没有为属性显示指定明确的值,默认约束将会为其自动设定为默认值。
创建方法:
Create table temp2(date1 datetime); ---创建表Temp2
ALter table temp2 add constraint DK_temp2 default (getdate()) for date1; ---设置数据列 date1的默认值为当前服务器时间