第 5章 约束、默认和规则
5.1 数据完整性
5.2 约束
5.3 默认
5.4 规则
5.1 数据完整性数据库应用程序开发中的一个重要步骤就是设计和实施数据的完整性,并确定实施数据完整性的最佳方案 。
数据完整性是指数据库中数据的正确性和一致性,
是衡量数据库质量的一个重要标准。在使用 INSERT、
UPDATE和 DELETE命令修改数据库中的数据时,数据的完整性可能被破坏,如插入了一个不存在学生的成绩,或将学生的班号修改为一个不存在的班级等。
通过定义数据完整性规则,SQL Server可以通过自身提供的完整性规则有效地管理数据的输入,而不必使用额外的应用程序来协助管理,这样一方面可以节省系统开销,另一方面将使数据库中的数据独立于应用程序,使创建开放式数据库系统成为可能。

5
章约束

默认和规则
< >
5.1 数据完整性
5.1.1 域完整性域完整性是指给定列的输入有效性 。 强制域有效性的方法有:通过限制数据类型 (包括自定义数据类型 ),格式 ( CHECK约束和规则 ) 或可能的取值范围 ( FOREIGN KEY约束,CHECK约束,DEFAULT定义,NOT NULL定义和规则 ) 来实现 。
如:性别字段只能取,男,或,女,;课程成绩取值范围为 0∽ 100;姓名字段不能为空;
性别字段的默认值为,男,等等 。

5
章约束

默认和规则
< >
5.1 数据完整性
5.1.2 实体完整性实体完整性是指表中的每一行必须是惟一的 。
实体完整性强制表中的所有记录都有一个惟一的标识列,这个惟一标识列可能是一列,也可能有若干列的组合 。 强制实体完整性的方法有:
UNIQUE 约束,PRIMARY KEY 约 束 或
IDENTITY属性 。
如:在学生情况表中,学生的学号是惟一的,
它与每个学生一一对应;成绩表中,学号 +课程号是惟一的,它与每个学生的每门课相对应 。

5
章约束

默认和规则
< >
5.1 数据完整性
5.1.3 参照完整性参照完整性确保数据库中数据的一致性 。 在 SQL
Server中,参照完整性基于外键 ( 引用表 ) 与主键
( 被引用表 ) 之间或外键与惟一键之间的关系 ( 通过
FOREIGN KEY和 CHECK约束 ) 。 通过外键将引用表和被引用表关联起来 。 参照完整性通过已定义的表间关系,确保键值在所有表中都必须一致,因此不能引用不存在的值 ( 即指向不存在的行 ) 。 如果在被引用的表中,某一记录被外部键引用,则该记录就不能删除;若需要更改键值,那么在整个数据库中,对该键值的所有引用都要进行一致的更改,以保证数据的参照完整性 。

5
章约束

默认和规则
< >
5.1 数据完整性
5.1.4 用户定义完整性用户可以根据需要,可以在 SQL Server中定义不属于上述标准类别的特定规则的用户完整性定义 。 所有的完整性类型都支持用户自定义完整性 ( CREATE
TABLE中的所有列级和表级约束,存储过程和触发器 ) 。
5.1.5 数据完整性的实现方法在 SQL Server中,有两种方式可以实现数据完整性:
l 声明型数据完整性;
l 过程型数据完整性 。

5
章约束

默认和规则
< >
5.2 约束建立和使用约束的目的在于保证数据的完整性,设计表时需要定义列的有效值并通过列中数据,行中数据及表间数据决定如何强制保证数据的完整性,约束定义关于列中允许值的规则,是强制完整性的首选方法 。
约束是独立于表结构的,它作为数据库定义的一部分在创建表时声明,可以通过企业管理器或 ALTER TABLE语句添加或删除 。 当表被删除时,表所附带的所有约束同时被删除 。

5
章约束

默认和规则
< >
5.2 约束
5.2.1 约束的类型
域 完 整 性 (NOT NULL,DEFAULT,
CHECK )
实体完整性 ( PRIMARYKEY,UNIQUE )
参考完整性 ( FOREIGNKEY )

5
章约束

默认和规则
< >
5.2 约束
5.2.2 NOT NULL约束
NOT NULL约束又称非空约束,表示使用该约束的列不允许使用空值 。 若该列是主键,则系统强制主键列为非空约束,而其它列的非空约束必须根据需要加以设置 。
非空约束可以在 CREATE TABLE建表时实现,在表创建完成后,
也可以使用修改列属性的 T-SQL语句完成:
ALTER TABLE table_name
ALTER COLUMN column_name new_data_type [ NULL
| NOT NULL ]
【 例 5-1】 将学生信息表 ( Student) 中的学生姓名列强制非空约束 。
可以通过修改列属性的方法完成:
ALTER TABLE Student
ALTER COLUMN StudentName VARCHAR(10) NOT
NULL

5
章约束

默认和规则
< >
5.2 约束
5.2.3 DEFAULT约束当表中的某列必须有值,并且当使用 INSERT命令向数据表插入记录数据时,若用户没有明确指定该列的值,该列也需要有一个明确值的情况下,就需要使用 DEFAULT约束 。
使用了 DEFAULT约束的列,SQL Server将根据用户的插入数据,自动维护域完整性:当用户插入时该列有指定值,则该列使用该值插入,否则使用 DEFAULT约束中指定的默认值 。
DEFAULT约束可以使用以下方法实现:
l 作为表定义的一部分在创建表时创建 。
l 添加到现有表中;
l 删除现有的 DEFAULT 定义 。
ALTERTABLEStudent /*添加 DEFAULT约束 */
ADD CONSTRAINTDefault_SexDEFAULT'男 'FOR Sex

5
章约束

默认和规则
< >
5.2 约束
5.2.4 CHECK约束 。
CHECK约束用于限制输入到列中的值的范围,
从而强制数据库中数据的域完整性 。 它与 FOREIGN
KEY约束控制列中数值类似 。 区别在于它们判断值有效的方法不同,FOREIGN KEY约束从另一个表中获得有效数值列表,而 CHECK约束通过逻辑表达式的成立与否加以判断 。
定义 CHECK约束的格式为:
CONSTRAINTconstraint_name
CHECK[ NOT FORREPLICATION ] ( logical_expression)

5
章约束

默认和规则
< >
5.2 约束
【 例 5-3】 为专业情况表 (Speciality)中的专业代码
(SpecialityID)列创建一个 CHECK约束,将专业代码限定为 五位,其中第一位只能是,a”-“z”或,A”-
“Z”,其它位为,0”-“9”,使用其它符号将被认为是无效的 。
USE Educational -- 选择当前数据库
GO
-- 定义 CHECK约束
ALTER TABLE Speciality
ADD
CONSTRAINT Chk_SpecialityID CHECK
( SpecialityID LIKE '[A-Z][0-9][0-9][0-9][0-9]' )

5
章约束

默认和规则
< >
5.2 约束
5.2.5 PRIMARY KEY(主键 )约束在一个表中,存在着这样的字段,它在每个记录中的值都是惟一的,因此可以用来标识表中的各个不同记录 。 这样的字段被称为关键字,关键字可以是列或列的组合 。 例如学生情况表中的 StudentID列就是一个关键字,因为每个学生的学号必须是惟一的 。
当表中有两个或两个以上的列或列的组合满足以上条件时,称这些列或列的组合为候选关键字 。
当表的关键字多于一个时,可以将其中的一个关键字作为主键 (PRIMARYKEY)。

5
章约束

默认和规则
< >
5.2 约束
5.2.5 PRIMARY KEY(主键 )约束当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键 。 PRIMARYKEY约束有以下两种:
l 列级 PRIMARYKEY约束,其定义格式为:
[ CONSTRAINTconstraint_name]
PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] /* 是否创建聚集或非聚集索引 */
[ WITHFILLFACTOR= fillfactor]
[ON{filegroup| DEFAULT}]
l 行级 PRIMARY KEY约束,其定义格式为:
[ CONSTRAINTconstraint_name]
PRIMARYKEY [ CLUSTERED| NONCLUSTERED]
( column[ ASC| DESC] [,...n] )
[ WITHFILLFACTOR= fillfactor]
[ ON{ filegroup| DEFAULT} ]

5
章约束

默认和规则
< >
5.2 约束
【 例 5-4】 为 成 绩 表 中 的 学 号 和 课 程 号 列
( StudentID+CourseID) 添加一个 PRIMARY KEY
约束 。
ALTER TABLE Grade
ADD
CONSTRAINT PK_Grade
PRIMARY KEY( StudentID,CourseID );

5
章约束

默认和规则
< >
5.2 约束
5.2.6 UNIQUE约束
UNIQUE 约束确保表中指定列中不出现重复值,即表中任意两行在该列上的值都不允许相同 。
在创建或更改表时可定义 UNIQUE约束 。 UNIQUE约束有以下两种:
l 列级 UNIQUE约束,其定义格式为:
[ CONSTRAINTconstraint_name]
UNIQUE [ CLUSTERED| NONCLUSTERED]
[ WITHFILLFACTOR= fillfactor]
[ON{filegroup| DEFAULT}]
l 行级 UNIQUE约束,其定义格式为:
[ CONSTRAINTconstraint_name]
UNIQUE [ CLUSTERED| NONCLUSTERED]
( column[ ASC| DESC] [,...n] )
[ WITHFILLFACTOR= fillfactor]
[ ON{ filegroup| DEFAULT} ]

5
章约束

默认和规则
< >
5.2 约束
【 例 5-5】 为系情况表 (Department)中的系名列
(DepartmentName) 添加一个 UNIQUE约束 。
ALTER TABLE Department
ADD
CONSTRAINT UNIQUE_DepartmentName
UNIQUE (DepartmentName);

5
章约束

默认和规则
< >
5.2 约束
5.2.7 FOREIGN KEY约束若列或列的组合不是本表的关键字,而是另一个表 的 关 键 字,则 称 这 些 列 或 列 的 组 合 是 外 键
(FOREIGN KEY)。 一般表与表之间通过主键和外键进行连接,通过它可以强制表与表之间的参照完整性 。
FOREIGN KEY约束要求列中的每个值在被引用表中对应的被引用列中都存在 。 如学生情况表
(Student)表中的所在班级 (ClassID)就是一个外键,
它与班级情况表 (Class)表中的主键班号 (ClassID)
进行关联 。

5
章约束

默认和规则
< >
5.2 约束
l 行级 FOREIGN KEY约束,其定义格式为:
[ CONSTRAINTconstraint_name]
FOREIGN KEY [( column [,…n] )] /* 引用表中的列名或列名的组合 */
REFERENCES ref_table[(ref_column[,…n ])] /* 被引用表及其列名 */
[ ON DELETE { CASCADE | NO ACTION } ]
/*是否级联删除相关的记录 */
[ ONUPDATE{ CASCADE| NO ACTION} ] /* 是否级联更新相关的记录 */
[ NOT FORREPLICATION]

5
章约束

默认和规则
< >
5.2 约束
【 例 5-6】 为 Student表中的所在班级列 (ClassID)添加一个 FOREIGN KEY约束 。
ALTER TABLE Student
ADD
CONSTRAINT FK_Student_Class
FOREIGNKEY(ClassID)
REFERENCESClass(ClassID)
ONUPDATECASCADE

5
章约束

默认和规则
< >
5.2 约束
5.2.8 使用企业管理器管理约束
1,管理 NOT NULL,DEFAULT约束
1) 启动企业管理器,展开服务器组,再展开要操作的服务器 。
2) 展开,数据库,文件夹,再展开要操作的数据库 ( Educational) 。
3) 单击展开的,表,项,在右边的,表,列表框中显示出所选数据库中的所有表 。
4) 右击要在其中设置 NOT NULL,DEFAULT约束的数据表 ( Student),
在弹出的快捷菜单中选择,设计表,菜单项,出现 图 5 2所示的,设计表
Student”对话框 。
5) 中间列表中的一行为一列的定义,选中要设置 NOT NULL约束的
StudentName列,单击行尾,允许空,列,将其中的,√” 去掉即可实现
NOT NULL约束 。 再次单击就可删除 NOT NULL约束 。
6) 单击 Sex列,在图 5 2下部的列属性表的,默认值,一栏所对应的输入框中输入 Sex列的默认值,男,。 去掉默认值时,只需将,默认值,
一栏所对应的输入框中的文字删除即可 。
7) 设置完成后,单击工具栏上的,” 按钮,保存修改的结果 。

5
章约束

默认和规则
< >
5.2 约束
5.2.8 使用企业管理器管理约束
2,管理 CHECK约束
1) 按上面的方法进入图 5-2所示的表设计器 。
2) 单击工具栏上的,管理约束,按钮,出现如 图 5 3所示的,属性,
对话框 。 在,选定的约束,列表框中存放有该表已创建的 CHECK约束 。
3) 单击,新建,按钮,新建一个 CHECK约束,系统自动为新建的
CHECK约束设置一个缺省名,并清空下面的,约束表达式,输入框 。
4) 先在下面的,约束表达式,输入框中输入需创建 CHECK约束的约束表达式,如图 5-3所示,然后在,约束名,输入框中将缺省名修改为需创建的 CHECK约束名 。
5) 若选中,创建中检查现存数据,复选框,则表示当该约束存盘时,
系统先检查表中已有的数据是否符合该 CHECK约束的条件,如不符合,系统将出现,不能添加约束,错误并拒绝存盘;如符合,则创建 CHECK约束成功 。 否则系统将不检查表中已有的数据,直接创建 CHECK约束 。
6) 单击,关闭,按钮,退出,属性,对话框 。

5
章约束

默认和规则
< >
5.2 约束
5.2.8 使用企业管理器管理约束
3,管理 PRIMARY KEY约束
1) 主键约束的设置非常简单,按上面的方法进入图 5-2所示的表设计器 。
2) 若表中列的前面是一个空白的,方块,,表明该列不是,主键,。 若需要将某列设置为主键,首先用鼠标单击该列,然后单击工具栏上的,” 设置主键按钮,则该列前面的
,方块,中将出现主键标志,”,如图 5-2所示 。
3) 再次单击工具栏上的,” 设置主键按钮,则取消主键的设置 。

5
章约束

默认和规则
< >
5.2 约束
5.2.8 使用企业管理器管理约束
4,管理 UNIQUE约束
1) 按上面的方法在表设计器中打开系情况表 (Department)。
2) 单击工具栏上的,” 管理索引 /鍵按钮,出现如 图 5 -4所示的,属性,对话框,索引 /鍵,选项页 。 在,选定的索引,列表框中存放有该表已创建的 UNIQUE约束和索引 。
3) 单击,新建,按钮,新建一个 UNIQUE约束或索引,系统自动为新建的 UNIQUE约束或索引设置一个缺省名,下面的,列名,列表框中自动出现该表的第一个列名 。
4) 在下面的,列名,列表框中选择要进行 UNIQUE约束的列名 。 若该
UNIQUE约束有二个或二个以上列组成,则可以在第一个,列名,列表框的下一行中再次选择即可 。
5) 单击并选中,创建 UNIQUE”复选框,并选中,约束,单选按钮 。
6) 在,索引名,输入框中输入一个合适的约束名 。
7) 单击,关闭,按钮,退出,属性,对话框 。

5
章约束

默认和规则
< >
5.3 默认默认是一种数据库对象,它指定在向表中插入数据时,若用户没有给出某列的相关值,SQL
Server自动将该列使用默认值 。 它可以被绑定到一个或多个列中使用 。 默认值的定义与表存储在一起,
因此可以反复使用 。 绑定于列的默认值优先于绑定在用户自定义数据类型的默认值 。
默认值执行与使用 CREATE TABLE或 ALTER
语句的 DEFAULT关键字创建的默认值定义相同的功能 。 默认值定义是限制列数据的首选并是标准的方法,因为其定义和表存储在一起,当除去表时,将自动除去默认值定义 。

5
章约束

默认和规则
< >
5.3 默认
5.3.1 创建 DEFAULT(默认 )对象默认是一种数据库对象,可以绑定的一列或多列上,也可以绑定到用户定义的数据类型上 。 当需要将默认值绑定到列或用户定义数据类型时,就需要创建默认对象 。 当使用 INSERT语句向表中插入数据时,如果绑定有默认值的列或用户定义数据类型没有明确提供数据,系统自动就将默认值插入到对象所绑定的列中 (在用户定义数据类型的情况下,插入到使用该数据类型的所有列中 )。
创建默认对象的 SQL语句语法格式为:
CREATE DEFAULT default /*默认对象名 */
AS constant_expression /*默认对应的常量表达式 */

5
章约束

默认和规则
< >
5.3 默认
5.3.2 绑定默认当默认对象创建后,并不能直接使用,必须将其绑定到某一列或用户定义的数据类型上方能有效 。
执行系统存储过程 sp_bindefault或使用企业管理器可以绑定默认值 。
绑定默认的 SQL语句语法格式为:
sp_bindefault [ @defname = ] 'default_name',
[ @objname = ] 'object_name'
[,[ @futureonly = ] 'futureonly_flag' ]
如:
sp_bindefault 'Default_TechnicalPost',
'Teacher.TechnicalPost'

5
章约束

默认和规则
< >
5.3 默认
5.3.3 删除默认对象默认对象被绑定到一列或用户定义的数据类型后,不能直接删除默认对象,必须先使用存储过程
sp_unbindefault解除该默认对象所使用的绑定,然后才能使用 DROP DEFAULT语句删除默认对象 。
解除默认值绑定的存储过程 sp_unbindefault的语法格式为:
sp_unbindefault [@objname =] 'object_name'
[,[@futureonly =] 'futureonly_flag']
删除默认对象的语法格式为:
DROP DEFAULT { default_name } [,...n ]

5
章约束

默认和规则
< >
5.3 默认
5.3.4 使用企业管理器管理默认
1,创建默认对象
1) 启动企业管理器 。
2) 展开服务器组,然后展开要操作的服务器 。
3) 展开,数据库,文件夹,再展开要在其中创建 DEFAULT
对象的数据库 ( Educational) 。
4) 右击,默认,,在出现的快捷菜单中单击,新建默认,
菜单项 ( 如图 5-6所示 ),弹出图 5-7所示的,默认属性,对话框 。
5 ) 在,名称,框 中 输 入 该 DEFAULT 对 象 的 名 称
,Default_TechnicalPost”。
6) 在,值,框中输入该 DEFAULT对象的值 ‘ 讲师 ’ 。 值可以是常量或表达式 。
7) 单击,确定,按钮,就在当前数据库中创建了一个名为 Default_TechnicalPost的默认对象 。

5
章约束

默认和规则
< >
5.3 默认
5.3.4 使用企业管理器管理默认
2,绑定 默认对象
1) 在企业管理器中展开,数据库,文件夹,再展开要在其中绑定 DEFAULT对象的数据库 (Educational)。
2) 单击,默认,,右边将显示该数据库中已存在的默认对象 ( 如图 5-8所示 ) 。 双击要进行绑定的默认对象,出现与图 5-7类似的,默认属性,对话框,只不过名称栏已变灰 。
3) 单击,绑定列,按钮,出现如图 5-9所示的,将默认值绑定到列,对话框 。
4) 对话框上部,从,表,下拉式组合框中选择要绑定的表,这里选择 Teacher。
5) 在对话框下部,将左边的,未绑定的列,列表框中的未绑定列的列移到右边的,绑定列,列表框中 。
6) 依次单击,应用,,,确定,按钮,绑定任务完成 。

5
章约束

默认和规则
< >
5.3 默认
5.3.4 使用企业管理器管理默认
3,解除绑定并删除 默认对象
1) 在企业管理器中进入图 5-8,在右边已存在默认对象列表框中找到要解除绑定的默认对象 。
2) 双击要解除绑定的默认对象,出现与图 5-7类似的,默认属性,对话框,只不过名称栏已变灰 。
3) 单击,绑定列,按钮,出现如图 5-9所示的,将默认值绑定到列,对话框 。
4) 在对话框上部,从,表,下拉式组合框中选择要解除绑定的表,这里选择 Teacher,出现如图 5-10所示的,绑定或解除绑定,对话框,右边的,绑定列,列表框中将出现所选表中所有已绑定列的列名 。
5) 单击,绑定列,列表框中要解除绑定的列名,这里为
TechnicalPost。 中间的,删除,按钮将变为有效 。
6) 单击,删除,按钮,原在右边,绑定列,列表框中的
TechnicalPost列被删除而移到了左边的,未绑定的列,列表框中 。

5
章约束

默认和规则
< >
5.4 规则规则用来验证插入或更新到数据库中的数据的有效性 。
当绑定了规则的列中数据被插入或更新时,系统首先检查数据是否符合规则的要求,若不符合规则将拒绝执行此插入或更新操作 。
规则是一种数据库对象,其作用与 CHECK约束类似,通过定义的表达式来限制输入到列或用户定义的数据类型中的允许值范围,是实现域完整性的方法之一 。
CHECK约束是对列中的值进行限制的首选标准方法,可以对一列或多列定义多个约束 。 而列或用户定义数据类型只能有一个绑定的规则 。 但是,列可以同时绑定一个规则并定义一个或多个 CHECK约束,此时,当插入或更新数据时,系统将检查所有的限制 。
规则的使用与默认相似,使用前必须先创建规则,然后既可以被绑定到一列或多列上,也可以被绑定到用户定义的数据类型上使用 。

5
章约束

默认和规则
< >
5.4 规则
5.4.1 创建规则规则是一种数据库对象,在 使 用 前 必 须 用
CREATERULE命令或通过企业管理器创建 。
创建规则的 CREATE RULE命令的语法格式如下:
CREATERULErule_name /* rule_name为需创建的规则名称 */
AScondition_expression /*定义规则的条件 */

5
章约束

默认和规则
< >
5.4 规则
【 例 5-10】 为 Educational数据库创建二个规则
Rule_Grade,Rule_Sex,分别用于限定成绩和性别的范围 。
USEEducational
GO
CREATERULERule_Grade
AS @Grade>=0 AND @Grade<=100
GO
CREATERULERule_Sex
AS @Sex IN ( '男 ','女 ' )
GO

5
章约束

默认和规则
< >
5.4 规则
5.4.2 绑定规则与默认对象类似,当规则创建后,并不能直接使用,必须将其绑定到某一列或用户定义的数据类型上方能有效 。
执行系统存储过程 sp_bindrule或使用企业管理器可以绑定规则 。
绑定规则的 SQL语句语法格式为:
sp_bindrule [ @rulename = ] 'rule_name',
[ @objname = ] 'object_name'
[,[ @futureonly = ] 'futureonly_flag' ]

5
章约束

默认和规则
< >
5.4 规则
【 例 5-10】 将例 5-11 中创建的规则
Rule_Grade,Rule_Sex分别绑定到成绩表
(Grade) 的成绩 (Grade) 列 与 学 生 情 况 表
(Student)的性别 (Sex)列 。
USEEducational
GO
EXECsp_bindruleRule_Grade,'Grade.Grade'
EXECsp_bindruleRule_Sex,'Student.Sex'

5
章约束

默认和规则
< >
5.4 规则
5.4.3 删除规则与删除默认对象相似,规则被绑定到一列或用户定义的数据类型后,不能直接删除,必须先使用存储过程 sp_unbindrule解除该规则所使用的绑定,然后才能使用 DROP RULE语句删除规则 。
解除规则绑定的存储过程 sp_unbindrule的语法格式为:
sp_unbindrule [@objname =] 'object_name'
[,[@futureonly =] 'futureonly_flag']
解除绑定后,规则并没有删除,仍然存在于数据库中,要删除规则,还必须使用 DROP RULE命令将其删除 。
删除规则的语法格式为:
DROP RULE { rule_name } [,...n ]

5
章约束

默认和规则
< >