第六章 -- SQL Server 2000 数据完整性
6.1完整性的概念
6.2 约束的类型
6.3 约束的创建
6.4 查看约束的定义
6.5 删除约束
6.6 使用规则
6.7 使用默认
6.8 数据完整性强制选择方法第六章目录
6.1完整性的概念
1,实体完整性( Entity Integrity)
2,域完整性( Domain Integrity)
3,参照完整性( Referential Integrity)
4,4,用户定义的完整性( User-defined
Integrity)
数据完整性( Data Integrity)是指数据的精确性( Accuracy)和可靠性( Reliability)。
它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。
第六章
6.2约束的类型
1,NOT NULL 指定不接受 NULL 值的列
2,CHECK约束对可以放入列中的值进行限制,以强制执行域的完整性
3,UNIQUE 约束在列集内强制执行值的唯一性
4,PRIMARY KEY 约束标识列或列集,这些列或列集的值唯一标识表中的行
5,FOREIGN KEY 约束标识表之间的关系。
6,DEFAULT约束为列填入默认值
6.3约束的创建
6.3.1创建主键约束
6.3.2创建唯一约束
6.3.3创建检查约束
6.3.4创建默认约束
6.3.5创建外键约束第六章
6.3.1创建主键约束
1.用企业管理器创建主键约束
( 1)打开,企业管理器,,依次展开控制台根目录下的 Microsoft SQL
Servers,SQL Server组、服务器
(例如 local)、数据库,student、
表。这时在右方的表列表中显示出
student数据库中的所有表,包括系统表和用户表。
第六章
( 2)在表设计器中,选择需要设为主键的字段,如果需要选择多个字段时,请按住 Ctrl再选择其他列。
( 3)选择好后,用鼠标右击该字段,从弹出的菜单中选择,设置主键,如图 6.2,
( 4)执行完命令后,在该列前面会出现钥匙图样,说明主键设置成功
( 5)设置完成主键后,关闭表设计器。
2,使用 SQL语句创建主键约束使用 SQL语句创建主键,可以用 CREATE TABLE
命令在创建表的同时完成,也可以用 ALTER
TABLE命令为已经存在的表创建主键约束,语法格式如下,ALTER TABLE table_name
ADD
CONSTRAINT constraint_name
PRIMARY KEY
[CLUSTERED|NONCLUSTERED]
{(column[,… n])}
第六章其中:
l constraint_name指主键约束名称;
l CLUSTERED表示在该列上建立聚集索引;
l NOCLUSTERED表示在该列上建立非聚集索引。
下面分别使用建表命令和修改表命令创建主键约束。
6.3.2创建唯一约束
1,使用企业管理器创建唯一约束
( 1)在企业管理器中,右击需要设置唯一约束的表(本例为,系部,表),
在弹出的菜单中选择,设计表,,打开表设计器;
( 2)在表设计器中,右击需要设置为唯一约束的字段(本例为,系部名称,),选择,索引 /键,,如图 6.7,
也可以直接单击工具栏中的,管理索引 /键,按钮进入,索引 /键,属性对话框第六章
( 3)在弹出的,索引 /键,属性对话框中,选择,索引 /键,选项卡,单击,新建,按钮,然后在,索引名,文本框中输入唯一约束的名称,再从列名选项下拉框中选择字段名称(本例为,系部名称,),最后选择,创建 UNIQUE”复选框和,约束,单选框,如图 6.8。
( 4)单击,关闭,按钮,关闭对话框,
完成唯一约束的创建。这个时候,不只是该表的主键必须为唯一,并且被设置成为唯一约束的字段同样必须为唯一。
2.使用 SQL语句创建唯一约束为已经存在的表创建唯一约束,其语法格式如下:
ALTER TABLE table_name
ADD
CONSTRAINT constraint_name
UNIQUE
[CLUSTERED|NONCLUSTERED]
{(column[,… n])}
第六章其中:
table_name为需要创建唯一约束的表名称;
l constraint_name为唯一约束的名称;
column是表中需要创建唯一约束的字段名称
6.3.3创建检查约束
( 1)进入企业管理器控制台,找到需要创建检查约束的表,右击该表,选择,设计表,,进入表设计器,我们这里选择,课程,表;
( 2)在表设计器中右击需要创建检查约束的字段,这里为,学分,字段,
在弹出的菜单中选择,CHECK 约束,,
如图 6.10;
第六章
( 3)在对话框中,单击,新建,
按钮,然后在,约束名,文本框中输入检查约束名称,在约束表达式中输入约束条件,我们这里输入,([学分 ]>=1 AND [学分 ]<=7)”(注意,不包括引号),
如图 6.11。
( 4)单击,关闭,按钮关闭对话框,完成检查约束的创建。
2,使用 SQL语句创建检查约束使用 SQL语句在创建表的同时创建检查约束,如下例:
【 例 6.4】 利用 SQL语句创建,课程,表,并且在创建的同时,创建检查约束,使学分字段被约束在 1至
7之间。程序清单如下:
第六章
USE student
GO
CREATE TABLE 课程
(课程号 int PRIMARY KEY,
课程名 char(50),
学分 char(50),
CONSTRAINT 学分 CHECK (学分
BETWEEN 1 and 7 )
)GO
6.3.4创建默认约束
1.使用企业管理器创建默认约束下面以,学生,表为例,在性别字段创建默认为,男,的默认约束。
步骤如下:
( 1)在企业管理器中,找到需要创建第六章默认约束的表,选择右击,在弹出的菜单中选择,设计表,,进入表设计器;
( 2)选择需要创建默认约束的字段,然后在下方的,列,选项卡中找到,默认值,文本框,在其中输入默认值,本例为选择性别字段,在默认值中输入,男,,
如图 6.12;
( 3)关闭表设计器。
2,使用 SQL语句创建默认约束在创建表的同时,可以对创建的表中的字段创建默认约束使用 SQL语句同样可以为已存在的表创建默认约束,其语法如下:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
DEFAULT
constraint_expression[FOR
column_name]
第六章其中:
table_name是需要创建默认约束的表名称;
constraint_name默认约束名称;
constraint_expression默认值;
FOR column_name需要创建默认约束的字段名称。
6.3.5创建外键约束
1.使用企业管理器创建外键约束
( 1)打开企业管理器,找到需要创建外键约束的表,右击该表,选择
,设计表,,本例为,教师,表,
打开表设计器;
( 2)选择需要创建外键约束的字段,
单击工具栏中的管理关系按钮,或右击该字段,在快捷菜单中选择关系;
第六章
( 3)在关系选项卡中,单击
,新建,按钮,然后在主键表的下拉框中选择主键表,
这里为,系部,表,在外键表的下拉框中选择外键表,
这里为,教师,表,分别在主键表和外键表的下面,选择系部代码字段,如图 6.13;
( 4)单击关闭按钮。
2,使用 SQL语句创建外键约束使用 SQL语句创建外键约束的语法格式为:
ALTER TABLE table_name
ADD CONTRAINT
constraint_name
[FOREIGN
KEY]{(column_name[,… n])}
第六章
REFERENCES
ref_table[(ref_column_name[
,… n])]
其中:
l table_name是需要创建外键约束的表名称
l constraint_name是外键约束名称
6.4查看约束的定义
1,企业管理器查看约束信息使用企业管理器查看约束信息的步骤如下:
( 1)打开企业管理器控制台,右击要查看约束的表,点击,设计表,,进入表设计器;
( 2)右击该表,选择,属性,,打开属性对话框;
( 3)在属性对话框中可以选择,关系,,
,索引 /键,和,CHECK约束,选项卡来查看约束信息。
第六章
2,存储过程查看约束信息存储过程 sp_helptext是用来查看约束的一个系统提供的存储过程,
我们可以通过查询分析器来进行查看约束的名称、创建者、类型和创建时间,其语法格式为:
第六章
EXEC sp_help 约束名称如果该约束有具体的定义和文本,
那么可以用 sp_helptext来查看,
其语法格式为:
EXEC sp_helptext 约束名称
6.5删除约束
1,用企业管理器来删除表约束使用企业管理器删除约束非常方便,
正如我们在建立约束时的方法,我们只需要在表设计器中,如图 6.2将
,设置主键,前的复选钮取消可删除主键约束,或将默认值删除达到删除默认约束的结果;如图 6.8点击删除按钮删除唯一约束;如图 6.11点击删除按钮删除检查约束;如图 6.13点击删除按钮删除外键约束。
第六章
2,使用 DROP命令删除表约束利用 SQL语句也可以方便的删除一个或多个约束,其语法格式如下:
ALTER TABLE
table_name
DROP CONSTRAINT
constraint_name[,… n]
6.6使用规则
6.6.1 使用 SQL语句管理规则
1,创建规则
CREATE RULE rule_name AS
condition_expression
2,绑定规则
[EXECUTE] sp_bindrule ’规则名称 ’,’表名,字段名 ’ |’自定义数据类型名 ’
第六章
3,解绑规则
[EXECUTE]
sp_unbindrule ’表名,字段名 ’ |’自定义数据类型名 ’
4,删除规则
DROP RULE 规则名称 [,… n]
6.6.2使用企业管理器管理规则
1,创建规则我们以创建限制出生日期规则为例,
说明使用企业管理器创建规则的步骤:
( 1)打开企业管理器,展开控制台目录到数据库节点;
( 2)在数据库 student节点下,找到
,规则,节点,右击,规则,节点,
在快捷菜单中选择,新建规则,命令,
打开,规则属性,对话框;
第六章
( 3)在对话框中输入规则名称,本例为 csrq_rule,在下方的文本中输入
,@csrq>=‘1950/01/01’ AND
@csrq<=getdate()”表达式,
该表达式必须是以 @开头的局部变量,用来表示在插入或修改记录时所提供的值。如图
6.17;
( 4)单击确定,关闭对话框。
2,规则的绑定和解绑将创建好的规则绑定到某列或将规则从某列解绑都是在,规则属性,对话框中完成的,步骤如下:
( 1)打开企业管理器,展开到数据库节点;
( 2)单击规则图表,在右方打开规则详细信息,右击需要绑定或解绑的规则,在弹出的快捷菜单中选择,属性,
打开属性对话框,如图 6.18;
第六章
( 3)在该对话框中,如果要将规则绑定到列上,那么单击,绑定列,按钮,
打开,将规则绑定到列,对话框;
( 4)在该对话框中,,表,的下拉框中选择需要绑定的表,在,未绑定的列,列表中选择需要绑定的列,然后单击,添加,按钮,将该列添加到
,绑定列,列表中。如果要解绑规则,
则在,绑定列,中选择列后,单击
,删除,按钮。点击,确定,按钮关闭对话框。如图 6.19;
( 5)如果要将规则绑定到拥护定义的数据类型上,可以单击,绑定 UDT”按钮。
3,删除规则在企业管理器中删除规则非常简便,步骤如下:
( 1)打开企业管理器,找到数据库下的规则节点;
( 2)单击,规则,图标,在右方的详细列表中,选择需要删除的规则,右击规则名称,
在弹出的快捷菜单中选择,删除,命令,弹出,除去对象,对话框,如图 6.20;
( 3)在对话框中单击,全部除去,按钮,
删除所选规则。
第六章
6.7使用默认默认(也称默认值、缺省值)是一种数据对象,它与 DEFAULT(默认)约束的作用相同,
也是当向表中输入数据的时候,没有为列输入值的时候,系统自动给该列赋一个,默认值,。与 DEFAULT约束不同的是默认对象的定义独立于表,类似规则,可以通过定义一次,多次应用任意表的任意列,也可以应用于用户定义数据类型。
默认对象的使用方法类似规则,同样包括创建、绑定、解绑和删除。这些操作可以在查询分析器中完成,也可以通过企业管理器来管理。
第六章
6.7.1使用 SQL语句管理默认值
1,创建默认值
CREATE DEFAULT default_name
AS default_description
2,绑定默认值
[EXECUTE] sp_bindefault ’默认名称 ’,’表名,字段名 ’ |’自定义数据类型名 ’
第六章
3,解绑默认值
[EXECUTE]
sp_unbindefault ’表名,字段名 ’ |’自定义数据类型名 ’
4,删除默认值
DROP DEFAULT
default_name[,… n]
6.7.2使用企业管理器管理默认值在企业管理器中,管理默认值的方法和管理规则的方法相似。
下面简要介绍在企业管理器中管理默认值的方法。展开控制台节点,
选择默认值节点,右击节点,在快捷菜单中选择,新建默认,,在弹出的对话框中输入默认值名称和默认值,关闭对话框。
第六章将默认值绑定到列也需要进入
,默认属性,对话框,在其中选择,绑定列,按钮或,绑定
UDT”将默认绑定或解班到列或用户自定义数据类型上。
在默认值详细列表中,右击选择,删除,命令后在弹出的对话框中选择,全部除去,可删除默认值。
6.8数据完整性强制选择方法实现数据完整性,SQL Server
2000提供了许多方法。除了本章介绍的约束、默认和规则外,还有前面章节介绍的数据类型和后面需要学习的功能强大的触发器等。对于某一问题可能存在多种解决办法,我们该如何选择呢?我们应该根据系统的实际要求,从数据完整性方法实现的功能和开销综合考虑。
下面我们来简单讨论一下各种实现数据完整性的方法的功能和性能开销。
第六章触发器功能强大,既可以维护基础的数据完整性逻辑,又可以维护复杂的完整性逻辑,如多表的级联操作,但是开销较高;约束的功能比触发器弱,但开销低;默认和规则功能最弱,开销也低;
数据类型提供最低级别的数据完整性功能,开销也是最低的。
在选择完整性方案时,我们应该遵循在完成同样任务的条件下,选择开销低的方案解决。也就是说,能用约束完成的功能,就不用触发器完成;能用数据类型完成的功能,就不用规则来完成。
谢谢各位同学!
返回主页第六章