第六章 实现数据完整性
? 数据完整性概述
? 使用约束实现数据完整性
主键, 惟一, 核查
默认, 外键约束
? 使用规则实现数据完整性
? 使用默认值实现数据完整性
第六章 实现数据完整性
? 数据完整性概述
数据完整性就是指存储在数据库中的数据正确无误并
且相关数据具有一致性。数据库中是否存在完整的数据关
系到数据库系统能否真实地反映现实世界。它是衡量数据
库中数据质量好坏的一种标志,是确保正确的数据被存放
在正确的位置的一种手段。
根据数据完整性机制所作用的数据库对象和范围不同
,数据完整性可分,
实体完整性
值域完整性
引用完整性
用户定义完整性
第六章 实现数据完整性
? 数据完整性概述
1、实体完整性
这里的实体指表中的记录,一个实体就是表中的一条记录。实体
完整性要求在表中不能存在完全相同的记录,而且每条记录都要具有
一个非空且不重复的键值。这样就可以保证数据所代表的任何事物都
不存在重复。
实现实体完整性的方法主要有主键约束、唯一索引、唯一约束和
指定 IDENTITY属性
2、域完整性
组成记录的列称为域,域完整性也可称为列完整性。域完整性要
求向表中指定列输入的数据必须具有正确的数据类型、格式以及有效
的数据范围。
实现域完整性的方法主要有 CHECK约束、外键约束、默认约束
、非空定义、规则以及在建表时设置的数据类型。
第六章 实现数据完整性
? 数据完整性概述
3、引用完整性
引用完整性又称为参照完整性。引用完整性是指作用于有关联的
两个或两个以上的表,通过使用主键和外键或主键和唯一键之间的关
系,使表中的键值在所有表中保持一致。
实现引用完整性的方法主要有外键约束。
4、用户定义的完整性
用户定义的完整性是应用领域需要遵守的约束条件,其允许用户
定义不属于其他任何完整性分类的特定业务规则。所有的完整性类型
都支持用户定义完整性。
第六章 实现数据完整性
? 使用约束实现数据完整性
约束是 SQL Server提供的自动强制数据完整性的一种方法,它是通过
定义列的取值规则来维护数据的完整性。
约束的类型:
PRIMARY KEY(主键)约束
主键约束用来强制数据的实体完整性,它是在表中定义一个 主键 来唯一标识
表中的每行记录。主键约束有如下特点:每个表中只能有一个主键,主键可
以是一列,也可以是多列的组合;主键值必须唯一并且不能为空,对于多列
组合的主键,某列值可以重复,但列的组合值必须唯一。
UNIQUE(唯一)约束
唯一约束用来强制数据的实体完整性,它主要用来限制表的非主键列中不允
许输入重复值。唯一约束有如下特点:一个表中可以定义多个唯一约束;每
个唯一约束可以定义到一列上,也可以定义到多列上;空值可以出现在某列
中一次。
第六章 实现数据完整性
? 使用约束实现数据完整性
NOT NULL(非空)约束
非空约束用来强制数据的域完整性,它用于设定某列值不能为空。如果指定
某列不能为空,则在进行插入记录时,此列必须要插入数据。
CHECK(检查)约束
检查约束用来强制数据的域完整性,它使用逻辑表达式来限制表中的列可以
接受哪些数据值。
DEFAULT(默认)约束
默认约束用来强制数据的域完整性,它为表中某列建立一个默认值,当用户
插入记录时,如果没有为该列提供输入值,则系统会自动将默认值赋给该列
。默认值可以是常量、内置函数或表达式。使用默认约束可以提高输入记录
的速度。
FOREIGN KEY(外健)约束
外键是指一个表中的一列或列组合,它虽不是该表的主键,但却是另一个表
的主键。通过外键约束可以为相关联的两个表建立联系,实现数据的引用完
整性,维护两表之间数据的一致性关系。
第六章 实现数据完整性
? 使用约束实现数据完整性
约束还可以分为列约束和表约束两类。当约束被定义于某个表的
一列时称为列约束,定义于某个表的多列时称为表约束。当一个约束
中必须包含一个以上的列时,必须使用表约束。
约束的操作 (创建、修改、删除 )
注意:
1、什么约束可以实现需要的数据完整性:不同的约束提供了不同的
功能。
2、在什么时候实施约束最合适,SQL server允许推迟或者禁用某些
已经定义的约束。
第六章 实现数据完整性
? 使用约束实现数据完整性
创建主建约束
1、使用企业管理器创建
1)打开企业管理器,展开控制台目录,依次展开服务器组、服务
器、数据库节点,选择表对象,在右边详细窗格中选择要创建
约束的表,启动表设计器。
2)在表设计器中,选择需要设为主键的字段,如果需要选择多个
字段时,可以按住 Ctrl键,同时用鼠标单击每个要选择的字段

3)选好字段后,右击选择的某个字段,从弹出的快捷菜单中选择

设置主键”命令
4)执行命令后,在作为主键的字段前有一个钥匙样图标。也可以
在选择好字段后,单击工具栏中的“钥匙”工具按钮,设置主

5)设置主键完成。
第六章 实现数据完整性
? 使用约束实现数据完整性
创建主建约束
2、使用查询分析器创建主键
语法:
CREATE TABLE TABLE_NAME
( CLOUMN_NAME DATATYPE
[CONSTRAINT CONSTRAINT_NAME PRIMARY KEY]
[,…N]
[,CONSTRAINT CONSTRAINT_NAME
PRIMARY KEY(COLUMN_NAEM[,…N])]
)
定义列级主键约束
定义表级主键约束
第六章 实现数据完整性
? 使用约束实现数据完整性
例,CREATE TABLE S_B
(学号 CHAR(5),
书号 CHAR(5),
借阅时间 DATATIME,
归还时间 DATATIME,
CONSTRAINT P_Y PRIMARY KEY (学号,书号 ))
此例题就是建立了一个表级主键。
在 student库中,建立一个民族表(民族代码,民族名称),将民族代码指定为主键。
CREATE TABLE 民族
( 民族代码 char(2) CONSTRAINT pk_mzdm PRIMARY KEY,
民族名称 varchar(30) NOT NULL

GO
此例题就是建立了一个列级主键
第六章 实现数据完整性
? 使用约束实现数据完整性
在已经存在的表中创建主键约束:
语法:
ALTER TABLE table_name
ADD
CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED|NONCLUSTERED]
{(column[,…n])}
其中:
constraint_name:指主键约束名称。
CLUSTERED:表示在该列上建立聚集索引。
NONCLUSTERED:表示在该列上建立非聚集索引。
第六章 实现数据完整性
? 使用约束实现数据完整性
例:
在 student库中的课程注册表中,指定字段注册号为表的
主键,其程序清单如下:
USE Student
GO
ALTER TABLE 课程注册
ADD CONSTRAINT pk_zce
PRIMARY KEY CLUSTERED (注册号 )
GO
第六章 实现数据完整性
? 使用约束实现数据完整性
删除主键约束
语法,ALTER TABLE table_name
DROP
CONSTRAINT PRIMARYKEY_NAME
例,ALTER TABLE S_B
DROP
CONSTRAINT P_Y
浏览指定表中的主键信息:
SP_PKEYS table_name
第六章 实现数据完整性
? 使用约束实现数据完整性
UNIQUE约束
UNIQUE约束主要是用来确保不受 主键约束的列上的数据的惟一性
。主键与 UNIQUE约束的区别主要为:
1,UNIQUE约束,主要用在非主键的一列或多列上要求数据惟一的
情况。
2,UNIQUE约束,允许该列上存在 NULL值,而主键 决不允许出
现这种情况。
3、可以在一个表上设置多个 UNIQUE约束,而在一个表中只能设置
一个主键约束。
第六章 实现数据完整性
? 使用约束实现数据完整性
创建 UNIQUE约束
语法:
CREATE TABLE TABLE_NAME
( CLOUMN_NAME DATATYPE
[CONSTRAINT UNIQUE _NAME UNIQUE ]
[,…N]
[,CONSTRAINT UNIQUE _NAME
UNIQUE(COLUMN_NAEM[,…N])]
)
定义列级 UNIQUE约束
定义表级 UNIQUE约束
第六章 实现数据完整性
? 使用约束实现数据完整性
创建 UNIQUE约束
例:创建一个表级的 UNIQUE约束
CREATE TABLE test
( 编号 int CONSTRAINT PRIMARY KEY,
名称 char(20),
类型 char(20),
时间 datetime,
CONSTRAINT uniq_event UNIQUE (类型,时间 )
)
GO
第六章 实现数据完整性
? 使用约束实现数据完整性
添加 UNIQUE约束
为存在的表创建惟一约束,其语法格式如下::
ALTER TABLE table_name
ADD
CONSTRAINT unique_name
UNIQUE [CLUSTERED|NONCLUSTERED]
{(column[,…n])}
例:在 student库中,为“民族”表中的“民族名称”字段创建一个惟
一约
束。其程序清单如下:
ALTER TABLE 民族
ADD CONSTRAINT uk_mzmz
UNIQUE NONCLUSTERED (民族名称 )
GO
第六章 实现数据完整性
? 使用约束实现数据完整性
删除 UNIQUE约束
为存在惟一约束的表中删除惟一约束,其语法格式如下::
ALTER TABLE table_name
DROP
CONSTRAINT unique_name
例:在 student库中,为“民族”表中的“民族名称”字段删除惟一约
束。其程序清单如下:
ALTER TABLE 民族
DROP
CONSTRAINT uk_mzmz
GO
第六章 实现数据完整性
? 使用约束实现数据完整性
CHECK约束
CHECK(核查)约束通过检查输入表列的数据的值来维护值域的完
整性。核查约束通过对一个逻辑表达式的结果进行判断来对数据进行
核查。
注意,可以在一列上设置多个核查约束,也可以将一个核查约束应用
于多列。当一列受多个核查约束控制时,所有的约束按照创建
的顺序,依次进行数据有效性的核查。
一般来说,可以在下面两种情况下,设置核查约束无效:
1、在执行 INSERT语句或 UPDATE语句过程:事先知道对数据的增
加或修改将违反核查约束的规定,但这些操作又是必须的。
2、在复制进行时,在进行不同服务器间的复制操作的过程中,由于
两个服务器之间设置的核查约束不一致,如果不事先 使核查约束
无效,则有可能使某些数据无法进行复制。
第六章 实现数据完整性
? 使用约束实现数据完整性
创建 CHECK约束
使用 SQL语句为已存在的表创建检查约束,其语法格式如下:
ALTER TABLE table_name
Column_name column_definition
CHECK [NOT FOR REPLICATION]
(check_criterial)
|WITH CHECK|WITH NOCHECK
ADD CONSTRAINT constraint_name
CHECK (logical_expression)[,…N]
例:在 student库中,为学生表的出生日期列创建一个检查约束,以
保证输入的数据大于 1950年 1月 1日而小于当天的日期。
ALTER TABLE 学生
ADD CONSTRAINT ck_csrq
CHECK(出生日期 >‘ 01/01/1950’ AND 出生日期 <GETDATE() )
GO
添加新列的同时,添加核查约束
在已经存在的列上添加核查约束
第六章 实现数据完整性
? 使用约束实现数据完整性
创建 CHECK约束
例:创建一个有关销售记录的表,表中对 SaleID设置了核查约束,并规
定在进行复制过程中,使核查约束无效。
USE WEBDATA
GO
CREATE TEABLE Sales
( SaleID int CHECK NOT FOR REPLICATION (SaleID<=199999),
SalesRegion char(2),
CONSTRAINT ID_PK PRIMARY KEY (SaleID)
)
GO
第六章 实现数据完整性
? 使用约束实现数据完整性
删除 CHECK约束
使用 SQL语句将已存在核查约束删除,其语法格式如下:
ALTER TABLE table_name
DROP check_name
可以使用下面的语法使所有的约束或指定的约束无效:
ALTER TABLE table_name
CHECK | NOCHECK CONSTRAINT
ALL | CONSTRAINT_NAME
[,…N]
例:使 pubs数据库中 authors表上的所有约束无效
ALTER TABLE authors
NOCHECK CONSTRAINT ALL
GO
第六章 实现数据完整性
? 使用约束实现数据完整性
创建默认约束
使用 SQL语句为已存在的表创建默认约束,其语法格式如下:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
DEFAULT constant_expression [FOR column_name]
其中:
table_name:需要建立默认约束的表名。
constraint_name:默认约束名称。
constant_expression:默认值。
例:在 STUDENT数据库的“教师”表上,为“学历”字段创建一个
默认约束,其默认值为‘本科’。其程序清单如下:
ALTER TABLE 教师 ADD CONSTRAINT df_xueli
DEFAULT '本科 ' FOR 学历
GO
第六章 实现数据完整性
? 使用约束实现数据完整性
外键约束
1、外键主要用来维护两个表之间的一致性关系。外键的建立主要是
通过将一个表中的主键所在列包含在另一个表中,这些列就是另一个
表的外键。
2、外键约束不仅可以与另一张表上的主键约束建立联系,也可以与
另一张表上的 UNIQUE约束建立联系。
3、外键约束上允许存在为 NULL的值,则针对该列的外键约束核查
将被忽略。
4、外键同时也限制了对主键所在表的数据进行修改。当主键所在的
表的数据被另一张表的外键所引用时,用户将无法对主键里的数据进
行修改或删除。除非事先删除或修改引用的数据。
5、当一个新的数据加入到表格中,或对表格中已经存在的外键上的
数据进行修改时,新的数据必须存在于另一张表的主键上。
第六章 实现数据完整性
? 使用约束实现数据完整性
创建外键约束
语法,
CREATE TABLE table_name
( column_name column_definition
CONSTRAINT constraint_name
FOREIGN KEY REFERENCES ref_table(ref_column)
ON DELETE {CASCADE|NO ACTION}
ON UPDATE {CASCADE|NO ACTION}
NOT FOR REPLICATION
[,…N]
CONSTRAINT foreignkey_name
FOREIGN KEY (column[,…n])
REFERENCES ref_table(ref_column)
NOT FOR REPLICATION
[,…N]
)
ON DELETE
{CASCADE|NO ACTION}
表示在删除与外键相对应的
主键所在的行时,级联删除
(cascade)外键所在的行的数
据或者不做任何操作 (no
action)
ON update {CASCADE|NO
ACTION}
表示在删除与外键相对应的
主键所在的行时,级联修改
(cascade)外键所在的行的数
据或者不做任何操作 (no
action)
第六章 实现数据完整性
? 使用约束实现数据完整性
创建外键约束
create table test1
(pub_id varchar(20) primary key,
pub_name varchar(50),
address varchar(20),
city varchar(10),
state char(2),
country char(10)
)
go
create table test2
(author_id varchar(20) primary key,
author_name varchar(50),
phone varchar(20),
zipcode char(10)
)
创建外键约束
create table test3
( title_id int primary key
title_name varchar(50),
author_id varchar(20)
constraint for_auid
foreign key references test2(author_id)
on delete cascade not for replication,
pub_id varchar(20)
constraint for_pubid
foreign key references test1(pub_id)
not for replication,
)
第六章 实现数据完整性
? 使用约束实现数据完整性
创建外键约束 --在已经存在的表上创建外键约束
语法,
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
[ FOREIGN KEY ] {(column_name[,…])}
REFERENCES ref_table
[ ( ref_column_name[,…] ) ]
例:在 student库的班级表上,为专业代码字段创建一个外键约束,从而保证
输入有效的专业代码。其程序清单如下:
ALTER TABLE 班级
ADD CONSTRAINT fk_zydm FOREIGN KEY (专业代码 )
REFERENCES 专业 (专业代码 )
GO
第六章 实现数据完整性
? 使用约束实现数据完整性
删除外键约束
语法, ALTER TABLE table_name
DROP CONSTRAINT
FOREIGNKEY_PUBID
GO
例,ALTER TABLE test3
DROP CONSTRAINT
for_pubid
GO
ALTER TABLE test3
WITH CHECK ADD
CONSTRAINT for_pubid
FOREIGN KEY (pub_id)
REFERENCES test2(pub_id)
NOT FOR REPLICATION
GO
第六章 实现数据完整性
? 使用约束实现数据完整性
查看约束的相关属性
1、使用企业管理器查看约束信息
( 1)在企业管理器中,选择要查看约束的表(如:学生表),打开表设计器。
( 2)在表设计器中可以查看主键约束、空值约束和默认值约束。
( 3)在表设计器中,右击鼠标,从弹出的快捷菜单中选择“属性”命令。弹出
“属性”对话框。
( 4)在“属性”对话框中通过切换选项卡,可以查看主键约束、外键约束与
CHECK约束信息。
2、使用系统存储过程查看约束信息
系统存储过程 sp_help用来查看约束的名称、创建者、类型和创建时间,语法:
[EXEC] sp_help 约束名称
如果约束存在文本信息,可以使用 sp_helptext来查看,其语法格式为:
[EXEC] sp_helptext 约束名称
[EXEC] sp_pkeys table_name [EXEC] sp_fkeys table_name
第六章 实现数据完整性
?使用规则实现数据完整性
规则与 CHECK比较
1,规则是一种数据库对象, 它的作用与 CHECK约束相同, 用来限
制输入值的取值范围, 实现强制数据的域完整性 。
2,规则与 CHECK约束相比较, CHECK约束比规则更简明, 它可
以在建表时由 CREATE TABLE语句将其作为表的一部分进行指定,
而规则需要单独创建, 然后绑定到列上 。
3,在一个列上只能应用一个规则, 但是却可以应用多个 CHECK约
束 。
4,一个规则只需定义一次就可以被多次应用, 可以应用于多个表或
多个列, 还可以应用到用户定义的数据类型上 。 而 CHECK则不能 。
第六章 实现数据完整性
?使用规则实现数据完整性
使用 SQL语句管理规则 (创建, 绑定, 解绑, 删除 )
1,创建规则 规则是一种数据库对象, 在使用之前需要被创建 。
语法,CREATE RULE rule_name
AS condition_expression
其中:
rule_name 指规则对象的名称, 其必须符合命名规则
condition_expression 条件表达式
例,CREATE RULE xb_rule
AS @xb in(‘男 ’,‘女 ’ )
GO
第六章 实现数据完整性
?使用规则实现数据完整性
使用 SQL语句管理规则 (创建, 绑定, 解绑, 删除 )
2,绑定规则 创建好的规则, 必须绑定到列或用户定义的数据类型上
才能够起作用 。 使用系统存储过程将规则绑定到字段或用户定义的数
据类型上 。
语法,[EXEC] sp_bindrule ‘规则名称 ’,‘表名,字段名 ’
例,EXEC sp_bindrule ‘xb_rule’,‘教师,性别 ’
3,解绑 如果某个字段不再需要规则对其输入的数据进行限制, 应该
将规则从该字段上去掉, 即解绑 。
语法,[EXEC] sp_unbindrule ‘表名,字段名 ’
4,删除规则 如果规则没有存在价值, 可以将其删除 。 在删除之前,
应该对规则解绑, 当规则不再应用与任何表时, 可以删除 。
语法,DROP RULE 规则名称 [,… n]
第六章 实现数据完整性
?使用默认值实现数据完整性
默认 ( 也称默认值 ) 是一种数据库对象, 它与 DEFAULT
( 默认 ) 约束的作用相同, 也是当向表中输入记录时, 没有为某
列提供输入值, 如果该列被绑定了默认对象, 系统会自动将其值
赋给该列 。
与 DEFAULT约束不同的是默认对象的定义独立于表, 其定义
一次就可以被多次应用于任意表中的一列或多列, 也可以应用于
用户定义的数据类型 。
默认对象的使用方法同规则相似, 包含默认的创建, 绑定, 解
绑和删除 。 这些操作既可以在查询分析器中完成, 也可以在企业
管理器中完成 。
第六章 实现数据完整性
?使用默认值实现数据完整性
1、创建默认值
在查询分析器中,创建默认对象的语法格式如下:
CREATE DEFAULT default_name AS default_description
其中:
default_name:指默认值名称,其必须符合 SQL Server的标识符命名
规则。
default_description:常量表达式,可以包含常量、内置函数或数学表
达式。
2、绑定默认值
默认对象建立以后,必须将其绑定到表字段或用户定义的数据类型上
才能起作用。在查询分析器中使用系统存储过程来完成绑定,其语法
格式为:
[EXECUTE] sp_bindefault ‘默认名称’,’表名,字段名’
第六章 实现数据完整性
?使用默认值实现数据完整性
例:创建一个 df_xuefen 默认,将其绑定到“教学计划”表的“学
分”字段,使其默认学分为 4,其程序清单如下:
USE STUDENT
GO
CREATE DEFAULT def_xuefen
AS 4
GO
EXEC sp_bindefault 'def_xuefen','教学计划,学分 '
GO
第六章 实现数据完整性
?使用默认值实现数据完整性
3、解绑默认值
对于表中的字段,如果认为其默认值没有存在的必要时,可以使用系
统存储过程 sp_unbindefault解除其绑定的默认值,其语法格式为:
[EXECUTE] sp_unbindefault ‘表名,字段名’
4、删除默认值
当默认值不再有用时,可以将其删除。删除默认值之前,必须将其从
表中解绑。在查询分析器中使用 DROP语句删除默认值,语法如下:
DROP DEFAULT default_name[,…n]
例:从 STUDENT数据库中删除 def_xuefen默认值,其程序清单如下:
USE STUDENT
GO
EXEC sp_unbindefault '教学计划,学分 '
GO
DROP DEFAULT def_xuefen
GO
第六章 实现数据完整性
?使用 IDENTITY实现数据完整性
使用 Identity来定义一个列的属性值时,该属性列的值不必在插入
新行时为其赋值,因为服务器会自动为新增加的行中的该列来设置一
个惟一的行序列号。
语法:就是在建立表的同时,数据类型后标明 identity关键字即可。
例,create table test
( column1 int identity(1,2),
column2 int not null,
……
)
其中 (1,1)是指开始值为 1,增量值为 2。即系统自动排号,1,3,
5……
第六章 实现数据完整性
?使用 IDENTITY实现数据完整性
注意:
1、在每个表里最多只能有一个 Identity列,该列不允许为空,也不允
许设置默认值。
2,Identity列也需要有数据类型,建议使用以下数据类型,decimal
int numeric smallint tinyint
3、当表中的数据行数目达到了规定的上界或下界时,就不能再向表
中插入数据。因为服务器不会自动去寻找因为删除而没有使用的
Identity列的值。
4、一般情况下,不允许向人为的向 Identity列中插入数值,所以在插
入时,必须写明列清单。