15.4 数据完整性的概念与实施方法5.4.1 数据完整性概念数据完整性是指数据的正确性、完备性和一致性是
衡量数据库质量好坏的重要标准。在用INSERT、DELETE、UPDATE语句修改数据库内容时数据的完整性可能会遭到破坏。可能会存在下列情况无效的数据被添加到数据库的表中。如将学生考试成绩输入成负数SQL Server提供了对数据库中表、列实施数据完整性的方法。对表进行设计数据完整性有两个重要内容
标识列的有效值和确定如何强制列中的数据完整性。21. 域完整性域完整性是指一个列的输入有效性是否允许空值。强制域完
整性的方法有限制类型通过设定列的数据类型、格式
通过CHECK约束和规则或可能值的范围通过FOREIGN
KEY 约束、CHECK 约束、DEFAULT定义、NOT NULL定义和规
则。
2. 实体完整性实体完整性是指保证表中所有的行唯一。实体完整性要求表中的所有行都有一个唯一标识符。这个唯一标识符可能是一列
也可能是几列的组合称之为主键。也就是说表中主键在所
有行上必须取值唯一。强制实体完整性的方法有索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性 。3. 参照完整性参照完整性也叫引用完整性。参照完整性总是保证主关键字被引用表和外部关键字引用表之间的参照关系。它涉及两个或两个以上表数据的一致性维护。35.4.2 数据完整性实施方法1. 声明型数据完整性声明型数据完整性一般在对象创建时定义由SQL Server强制实施通常使用约束、缺省值和规则来实现。实现基本数据完整性的首选方法是使用声明型数据完整性。声明型数据完整性作为数据库对象说明的一部分在语法中实现
在CREATE TABLE和ALTER TABLE定义中使用CONSTRAINT、DEFAULT等语句限制表中的值。使用这种方法实现数据完整性简单且不易出错系统直接将实现数据完整性的要求定义在表
和列上。
2. 过程型数据完整性过程型数据完整性是指由某个过程引发而实施的数据完整性。
一般先写出实施数据完整性的条件再写出强制该条件所执行
的用于保证数据完整性的脚本。通常由触发器和存储过程实现。过程型数据完整性也可以在客户机和服务器上使用其它编程语言和工具实现。45.4.3约束1.约束的定义和类型约束是SQL Server提供的自动保持数据库完整性的一种方法 。列级约束列级约束是行定义的一部分只能够应用在一列上。表级约束表级约束的定义独立于列的定义可以应用在一个表
中的多列上。约束有六种类型非空约束、缺省约束、检查约束、主键约束、唯一约束、外键约束参照约束。非空约束NOT NULL表中的某些列必须存在有效值不允许有空值出现。这是最简单的数据完整性约束可在建表时将该列
声明为NOT NULL即可。缺省约束DEFALUT CONSTRAINTS当向数据库中的表插入数
据时如果用户没有明确给出某列的值SQL Server自动为该列输入指定值。5检查约束CHECK CONSTRAINTS限制插入列中的值的
范围。主键约束PRIMARY KEY CONSTRAINTS要求主键的列
上没有两行具有相同值也没有空值。唯一约束UNIQUE CONSTRAINTS要求表中所有行在
指定的列上没有完全相同的列值。外键约束FROEIGN KEY CONSTRAINTS要求正被插入或更新的列外键的新值必须在被参照表主表的相应列主键中已经存在。6不同的约束强制不同类型的数据完整性。表中 给出了两者的对应关系。完整性类型 约束类型域完整性非空约束
DEFAULTCHECK实体完整性PRIMARY KEYUNIQUE参照完整性FOREIGN KEY72.使用T-SQL语言创建、管理约束(1)使用CREATE TABLE语句创建约束使用CREATE TABLE语句创建约束的一般语法如下
CREATE TABLE table_namecolumn_name data_type[[CONSTRAINT constraint_name]{PRIMARY KEY [CLUSTERED | NONCLUSTERED]
| UNIQUE [CLUSTERED | NONCLUSTERED]
| [FOREIGN KEY] REFERENCES ref_table
[(ref_column) ]
| DEFAULT constant_expression
| CHECK(logical_expression)}
] [,...n]
)8其中table_name创建约束所在的表的名称。column_name列名。data_type数据类型。constraint_name约束名。在创建、修改、实现约束时注意以下几点
① 可以在已有的表上创建、修改、删除约束而不必删
除并重建表。
② 可以在应用程序中创建错误检查逻辑测试是否违反
约束。
③ 在给表添加约束时SQL将验证表中已有数据是否满
足正在添加的约束。9⑵ 缺省约束缺省约束是指当向数据库中的表插入数据时如果用户
没有明确给出某列的值时SQL Server自动为该列输入
的值缺省约束用于实现域的完整性。创建DEFAULT约束时应考虑以下因素DEFAULT约束只能用于INSERT语句不能用于具有IDENTITY属性的列每列只能有一个DEFAULT约束【例1】 为数据库JWGL中表teacher的SEX性别字段创
建一个缺省约束缺省值为1男USE JWGLGO
ALTER TABLE teacher
ADD CONSTRAINT default_sex
DEFAULT 1 FOR SEX10⑶ 检查约束检查约束用来指定某列可取值的清单、可取值的集合或可取值的
范围。检查约束主要用于实现域完整性。创建CHECK约束时应考虑以下因素当向数据库中的表执行插入或更新操作时检查插入的新列值是否满足CHECK约束条件不能在具有IDENTITY属性或具有timestamp或uniqueidentifier数据类型的列上放臵CHECK约束CHECK条件不能含有子查询
【例2】 为数据库JWGL中表student_course 的GRADE成绩字段
创建一个检查约束使得GRADE的值在0-100之间。
USE JWGLGOALTER TABLE student_course
ADD CONSTRAINT check_grade
CHECK (grade>=0 and grade<=100)11⑷ 主键约束主键约束保证某一列或一组列值的组合相对于表中的每一行都是唯一的
主键约束创建在表的主键列上它对实现实体完整性更加有用。主键约
束的作用就是为表创建主键。创建PRIMARY KEY约束时应考虑以下因素每个表只能有一个主键并且必须有一个主键;不允许有空值;参照约束使用它作为维护参照完整性的参考点;创建主键时在创建主键的列上创建了一个唯一索引可以是聚簇索引也可以是非聚簇索引默认是聚簇索引。
【例3】 将数据库JWGL中teacher表的teacher_id教师号字段设为主
键。USE JWGLGO
ALTER TABLE teacher
ADD CONSTRAINT PK_teacher_id
PRIMARY KEY clustered (teacher_id)12⑸ 唯一约束唯一约束限制表中指定列上所有的非空值必须唯一
即表中任意两行在指定列上都不允许有相同的值。创建UNIQUE约束时应考虑以下因素一个表可以放臵多个UNIQUE约束允许有空值创建唯一索引时强制UNIQUE约束【例4】 将数据库JWGL中teacher表的teacher_id教师号字段设为唯一约束。USE JWGLGOALTER TABLE department
ADD CONSTRAINT unique_department_name UNIQUE nonclustered (department_name)13唯一约束和主键约束的区别唯一约束与主键约束都为指定的列建立唯一索引即不允
许唯一索引的列上有相同的值。主键约束限制更严格不但不允许有重复值而且也不允许有空值。唯一约束与主键约束产生的索引可以是聚簇索引也可以
是非聚簇索引但在缺省情况下唯一约束产生非聚簇索引
主键约束产生聚簇索引。
⑹ 外键约束通过外键约束强制参照完整性。SQL Server提供了外键/主
键值约束。即满足以下两点① 存在外键时被参照表中这一行不能删除。② 向子表插入记录或更新子表中外键值的前提是必须保
证这个外键值与主表中主键的某个值相等或者该外键值为空否则不允许插入或修改外键值。14创建FOREIGN KEY约束时应考虑以下因素它提供一列或多列数据的参照完整性。FOREIGN KEY约束不自动创建索引。但如果考虑数据库的多表连接建议为外键创建一个索引以提高连接性能主键与外键的数据类型和长度必须一致或系统可转换
【例5】为表teacher创建外键department_id外键department_id参考表department中的主键department_id。USE JWGLGO
ALTER TABLE teacher
ADD CONSTRAINT FK_department_id
FOREIGN KEY (department_id)REFERENCES department(department_id)GO153. 使用企业管理器管理约束创建缺省约束创建缺省约束的具体步骤如下① 启动企业管理器。
② 分别点击“数据库”、“JWGL”、“表”显示数据库
JWGL中所有的表。
③ 右击要设臵缺省的表假设要设臵缺省的表为
teacher在系统弹出的快捷菜单上点击“设计表”④ 点击设臵缺省的列在下面列属性设臵栏的默认值输入框中输入对应缺省值即可。创建检查约束创建主键约束创建唯一性约束创建外键约束165.4.4 使用默认值1. 默认值的定义默认值是数据库对象之一它指定在向数据库中的表插入数
据时如果用户没有明确给出某列的值SQL Server自动为
该列使用此默认值。它是实现数据完整性的方法之一。在关系数据库中每个列都必须包含有值即使这个值是个空值。对于不接受空值的列就必须为该列输入某个非空值要么由用户明确输入
要么由SQL Server输入默认值。默认值可用于表中的列和用户定义数据类型。请注意缺省约束中使用的缺省值可以由用户创建时输入也可以通过绑定已创建的默认值来指定。在创建默认值时请考虑以下几点默认值需和它要绑定的列或用户定义数据类型具有相同的
数据类型。默认值需符合该列的所有规则。默认值缺省还需符合所有CHECK约束。创建、管理默认值可以用T-SQL语言也可以用企业管理器172. 使用T-SQL语言创建默认值⑴ 创建默认值的语法CREATE DEFAULT default_name AS
constant_expression这里default_name新建默认值的名称它必须遵循SQL Server标识符的命名规则。constant_expression默认值default_name的值是一个常数表达式在这个表达式中不能含有任何列名
或其他数据库对象名但可使用不涉及数据库对象的SQL Server内部函数。默认值创建后可以使用系统存储过程sp_helptext可
以查看用于定义一个默认值的SQL脚本。其语法是
sp_helptext default_name18⑵ 默认值的绑定默认值创建之后只有将其绑定到某个列或用户自定义数
据类型才能有效。使用系统存储过程sp_bindefault可实现与表中的列及用户自定义数据类型的绑定。一个默认值可以绑定到多个列或用户自定义数据类型。绑定默认值的语法是
sp_bindefault default_name, ‘object_name’
其中default_name 由CREATE DEFAULT 语句创建的默认值名
字它将与指定的列或用户定义数据类型相绑定。object_name 要与该默认值相绑定的列名或用户自定义数据类型名。如果指定的是表中的列其格式为‘table_name.column’否则被认为是用户自定义数据类型名。19默认值绑定的几点考虑① 绑定的默认值只适用于受INSERT语句影响的行。
② 不能将默认值绑定到系统数据类型或timestamp列。
③ 若绑定了一个默认值到一用户定义数据类型又给使用该
数据类型的列绑定了一个不同的默认值或规则则绑定到
列的默认值和规则有效。
⑶ 默认值绑定的解除一个默认值被绑定到表中的列或用户自定义的数据类型之后可使用系统存储过程sp_unbinddefault解除其绑定。绑定解
除后作为数据库对象的默认值仍然存在于数据库中。解除默认值绑定的语法是
sp_unbindefault ‘object_name’
object_name 要解除和默认值绑定的表的列名或用户自定
义数据类型名。如果指定的是表中的列其格式为“table_name.column”否则被认为是用户定义数据类型名。20⑷ 默认值绑定的删除如果一个默认值不再使用了可以用DROP语句将其删除。删除默认值的语法是
DROP DEFAULT default_namedefault_name 要删除默认值的名称。在删除默认值时应注意以下几点①DROP将默认值从数据库中删除。
② 如果要删除一个默认值必须解除这个默认值的所
有绑定否则该默认值就不能被删除掉。
③ 在一个批中不能既定义默认值又同时使用默认值。
④ 只有默认值的创建者可以删除默认值。21【例6】 为数据库JWGL创建一个名为profession_default 值为“讲师”的默认值并绑定到表teacher的
profession列然后解除这个绑定绑定解除后将此默认
值删除。
USE JWGL
GO
CREATE DEFAULT profession_default AS '讲师'
GO
sp_bindefault profession_default ,
'teacher.profession'GOsp_unbindefault 'teacher.profession'
DROP DEFAULT profession_defaultGO225.4.5 规则1. 规则的定义规则是数据库对象之一。它指定向表的某列或使用与该规则绑定的用户定义数据类型的所有列插入或更新数据时限制输入新值的取值范围。一个规则可以是值的清单或值的集合;值的范围;必须满足的单值条件;用like子句定义的编辑掩码;规则是实现域完整性的方法之一。规则用来验证一个数据库
中的数据是否处于一个指定的值域范围内是否与特定的格
式相匹配。当数据库中数据值被更新或被插入时就要检查新值是否遵循规则如果不符合规则就拒绝执行此更新或插入的操作。23规则可用于表中列或用户定义数据类型。规则在实现功能上等同于CHECK约束。用CREATE RULE语句创建规则
然后用sp_bindrule把它绑定至一列或用户定义的数据类
型。使用系统存储过程sp_helptext查看用于定义一个规则或缺省的SQL脚本。其语法是
sp_helptext rule_name在创建规则时应考虑以下几点① 缺省情况下规则将检查创建和绑定规则之前输入的数据。
② 规则可以绑定到一列、多列或数据库中的用户定
义数据类型。③ 规则要求一个值在一定范围内并与特定格式相匹配。
④ 在一个列上至多有一个规则起作用如果有多个
规则与一列相绑定那么只有最后绑定到该列的规
则才是有效的。242. 使用T-SQL语言创建、管理规则⑴ 创建规则的语法是CREATE RULE rule_name AS condition_expressionrule_name创建规则的名称应遵循SQL Server标识符的命
名规范。condition_expression指明定义规则的条件在这个条件表
达式中不能包含列名或其他数据库对象名但它带有一个@为前
缀的参数即参数的名字必须以@为第一个字符也称空间标志符( spaceholder)。意即这个规则被附加到这个空间标志符它只在规则定义中引用为数据项值在内存中保留空间以便
与规则作比较。
⑵ 规则的绑定规则创建之后只有将其绑定到某个列或用户自定义数据类型才能有效。使用系统存储过程sp_binderule可实现与表中的列及
用户自定义数据类型的绑定。
绑定规则的语法是sp_bindrule rule_name, object_name25其中rule_name由CREATE RULE语句创建的规则名字它将与指定的列或用户定义数据类型相捆绑。object_name指定要与该规则相绑定的列名或用户定义数据类型名。如果指定的是表中的列其格式为“table.column”否则被认为是用户定义数据类型名。绑定时应注意如下几点① 绑定的缺省只适用于受INSERT语句影响的行。② 绑定的规则只适用于受INSERT和UPDATE语句影响的
行。③ 不能将缺省或规则绑定到系统数据类型或timestamp列。26⑶ 解除规则使用系统存储过程sp_unbindrule可以解除由sp_unbindrule绑定到列或用户定义数据类型的规则。但
被解除的规则仍然存在于数据库中。解除规则的语法如下sp_unbindrule rule_name , object_name
其中rule_name由CREATE RULE语句创建的规则名字它将与
指定的列或用户定义数据类型相捆绑。object_name指定要解除与该规则相绑定的列名或用户
定义数据类型名。如果指定的是表中的列其格式为
table.column否则被认为是用户定义数据类型名。27⑷ 删除规则使用DROP RULE可删除由CREATE RULE命令创建的规则。删除规则的语法如下
DROP RULE [owner.] rule_name
其中rule_name要解除的规则。在删除规则时应注意以下几点
① 使用DROP可将规则从数据库中删除。
② 在删除规则之前需先从列中或用户定义数据类型中
解除绑定。
③ 只有规则定义者可以删除规则。28【例7】 为数据库JWGL创建一个规则grade_rule grade_rule的值大于等于0小于等于100并绑定到表
student_course的grade列然后解除这个绑定绑定解
除后将此规则删除。
USE JWGL
GO
create rule grade_rule as @grade>=0 and
@grade<=100
GO
sp_bindrule grade_rule , 'student_course.grade'GO
sp_unbindrule 'student_course.grade'GOdrop rule grade_rule295.4.6 使用标识列1. 标识列的定义
IDENTITY属性使得某一列的取值是基于上一行的列值和为该
列定义的步长自动生成的。IDENTITY列的值可以唯一地标
识表中的一行可以用于实现实体完整性。有关DENTITY列属性的特点及定义DENTITY列时的注意事项
本章第一节已经介绍。
2. 用T-SQL语言定义标识列⑴ 定义标识列的语法ALETR TABLE table_name
ADD column_name data_type IDENTITY(seed , increment)30table_name要添加标识列的表名。column_name要添加的标识列的名称。data_type要添加的标识列的数据类型。Seed标识列的种子值。Increment标识列的步长。
【例9】给表class增加一个标识列class_no种子值1步长1。USE JWGL
GO
ALTER TABLE class
ADD class_no int IDENTITY(1,1)
3. 用企业管理器定义标识列使用企业管理器定义标识列的方法在已经介绍。本章首页
衡量数据库质量好坏的重要标准。在用INSERT、DELETE、UPDATE语句修改数据库内容时数据的完整性可能会遭到破坏。可能会存在下列情况无效的数据被添加到数据库的表中。如将学生考试成绩输入成负数SQL Server提供了对数据库中表、列实施数据完整性的方法。对表进行设计数据完整性有两个重要内容
标识列的有效值和确定如何强制列中的数据完整性。21. 域完整性域完整性是指一个列的输入有效性是否允许空值。强制域完
整性的方法有限制类型通过设定列的数据类型、格式
通过CHECK约束和规则或可能值的范围通过FOREIGN
KEY 约束、CHECK 约束、DEFAULT定义、NOT NULL定义和规
则。
2. 实体完整性实体完整性是指保证表中所有的行唯一。实体完整性要求表中的所有行都有一个唯一标识符。这个唯一标识符可能是一列
也可能是几列的组合称之为主键。也就是说表中主键在所
有行上必须取值唯一。强制实体完整性的方法有索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性 。3. 参照完整性参照完整性也叫引用完整性。参照完整性总是保证主关键字被引用表和外部关键字引用表之间的参照关系。它涉及两个或两个以上表数据的一致性维护。35.4.2 数据完整性实施方法1. 声明型数据完整性声明型数据完整性一般在对象创建时定义由SQL Server强制实施通常使用约束、缺省值和规则来实现。实现基本数据完整性的首选方法是使用声明型数据完整性。声明型数据完整性作为数据库对象说明的一部分在语法中实现
在CREATE TABLE和ALTER TABLE定义中使用CONSTRAINT、DEFAULT等语句限制表中的值。使用这种方法实现数据完整性简单且不易出错系统直接将实现数据完整性的要求定义在表
和列上。
2. 过程型数据完整性过程型数据完整性是指由某个过程引发而实施的数据完整性。
一般先写出实施数据完整性的条件再写出强制该条件所执行
的用于保证数据完整性的脚本。通常由触发器和存储过程实现。过程型数据完整性也可以在客户机和服务器上使用其它编程语言和工具实现。45.4.3约束1.约束的定义和类型约束是SQL Server提供的自动保持数据库完整性的一种方法 。列级约束列级约束是行定义的一部分只能够应用在一列上。表级约束表级约束的定义独立于列的定义可以应用在一个表
中的多列上。约束有六种类型非空约束、缺省约束、检查约束、主键约束、唯一约束、外键约束参照约束。非空约束NOT NULL表中的某些列必须存在有效值不允许有空值出现。这是最简单的数据完整性约束可在建表时将该列
声明为NOT NULL即可。缺省约束DEFALUT CONSTRAINTS当向数据库中的表插入数
据时如果用户没有明确给出某列的值SQL Server自动为该列输入指定值。5检查约束CHECK CONSTRAINTS限制插入列中的值的
范围。主键约束PRIMARY KEY CONSTRAINTS要求主键的列
上没有两行具有相同值也没有空值。唯一约束UNIQUE CONSTRAINTS要求表中所有行在
指定的列上没有完全相同的列值。外键约束FROEIGN KEY CONSTRAINTS要求正被插入或更新的列外键的新值必须在被参照表主表的相应列主键中已经存在。6不同的约束强制不同类型的数据完整性。表中 给出了两者的对应关系。完整性类型 约束类型域完整性非空约束
DEFAULTCHECK实体完整性PRIMARY KEYUNIQUE参照完整性FOREIGN KEY72.使用T-SQL语言创建、管理约束(1)使用CREATE TABLE语句创建约束使用CREATE TABLE语句创建约束的一般语法如下
CREATE TABLE table_namecolumn_name data_type[[CONSTRAINT constraint_name]{PRIMARY KEY [CLUSTERED | NONCLUSTERED]
| UNIQUE [CLUSTERED | NONCLUSTERED]
| [FOREIGN KEY] REFERENCES ref_table
[(ref_column) ]
| DEFAULT constant_expression
| CHECK(logical_expression)}
] [,...n]
)8其中table_name创建约束所在的表的名称。column_name列名。data_type数据类型。constraint_name约束名。在创建、修改、实现约束时注意以下几点
① 可以在已有的表上创建、修改、删除约束而不必删
除并重建表。
② 可以在应用程序中创建错误检查逻辑测试是否违反
约束。
③ 在给表添加约束时SQL将验证表中已有数据是否满
足正在添加的约束。9⑵ 缺省约束缺省约束是指当向数据库中的表插入数据时如果用户
没有明确给出某列的值时SQL Server自动为该列输入
的值缺省约束用于实现域的完整性。创建DEFAULT约束时应考虑以下因素DEFAULT约束只能用于INSERT语句不能用于具有IDENTITY属性的列每列只能有一个DEFAULT约束【例1】 为数据库JWGL中表teacher的SEX性别字段创
建一个缺省约束缺省值为1男USE JWGLGO
ALTER TABLE teacher
ADD CONSTRAINT default_sex
DEFAULT 1 FOR SEX10⑶ 检查约束检查约束用来指定某列可取值的清单、可取值的集合或可取值的
范围。检查约束主要用于实现域完整性。创建CHECK约束时应考虑以下因素当向数据库中的表执行插入或更新操作时检查插入的新列值是否满足CHECK约束条件不能在具有IDENTITY属性或具有timestamp或uniqueidentifier数据类型的列上放臵CHECK约束CHECK条件不能含有子查询
【例2】 为数据库JWGL中表student_course 的GRADE成绩字段
创建一个检查约束使得GRADE的值在0-100之间。
USE JWGLGOALTER TABLE student_course
ADD CONSTRAINT check_grade
CHECK (grade>=0 and grade<=100)11⑷ 主键约束主键约束保证某一列或一组列值的组合相对于表中的每一行都是唯一的
主键约束创建在表的主键列上它对实现实体完整性更加有用。主键约
束的作用就是为表创建主键。创建PRIMARY KEY约束时应考虑以下因素每个表只能有一个主键并且必须有一个主键;不允许有空值;参照约束使用它作为维护参照完整性的参考点;创建主键时在创建主键的列上创建了一个唯一索引可以是聚簇索引也可以是非聚簇索引默认是聚簇索引。
【例3】 将数据库JWGL中teacher表的teacher_id教师号字段设为主
键。USE JWGLGO
ALTER TABLE teacher
ADD CONSTRAINT PK_teacher_id
PRIMARY KEY clustered (teacher_id)12⑸ 唯一约束唯一约束限制表中指定列上所有的非空值必须唯一
即表中任意两行在指定列上都不允许有相同的值。创建UNIQUE约束时应考虑以下因素一个表可以放臵多个UNIQUE约束允许有空值创建唯一索引时强制UNIQUE约束【例4】 将数据库JWGL中teacher表的teacher_id教师号字段设为唯一约束。USE JWGLGOALTER TABLE department
ADD CONSTRAINT unique_department_name UNIQUE nonclustered (department_name)13唯一约束和主键约束的区别唯一约束与主键约束都为指定的列建立唯一索引即不允
许唯一索引的列上有相同的值。主键约束限制更严格不但不允许有重复值而且也不允许有空值。唯一约束与主键约束产生的索引可以是聚簇索引也可以
是非聚簇索引但在缺省情况下唯一约束产生非聚簇索引
主键约束产生聚簇索引。
⑹ 外键约束通过外键约束强制参照完整性。SQL Server提供了外键/主
键值约束。即满足以下两点① 存在外键时被参照表中这一行不能删除。② 向子表插入记录或更新子表中外键值的前提是必须保
证这个外键值与主表中主键的某个值相等或者该外键值为空否则不允许插入或修改外键值。14创建FOREIGN KEY约束时应考虑以下因素它提供一列或多列数据的参照完整性。FOREIGN KEY约束不自动创建索引。但如果考虑数据库的多表连接建议为外键创建一个索引以提高连接性能主键与外键的数据类型和长度必须一致或系统可转换
【例5】为表teacher创建外键department_id外键department_id参考表department中的主键department_id。USE JWGLGO
ALTER TABLE teacher
ADD CONSTRAINT FK_department_id
FOREIGN KEY (department_id)REFERENCES department(department_id)GO153. 使用企业管理器管理约束创建缺省约束创建缺省约束的具体步骤如下① 启动企业管理器。
② 分别点击“数据库”、“JWGL”、“表”显示数据库
JWGL中所有的表。
③ 右击要设臵缺省的表假设要设臵缺省的表为
teacher在系统弹出的快捷菜单上点击“设计表”④ 点击设臵缺省的列在下面列属性设臵栏的默认值输入框中输入对应缺省值即可。创建检查约束创建主键约束创建唯一性约束创建外键约束165.4.4 使用默认值1. 默认值的定义默认值是数据库对象之一它指定在向数据库中的表插入数
据时如果用户没有明确给出某列的值SQL Server自动为
该列使用此默认值。它是实现数据完整性的方法之一。在关系数据库中每个列都必须包含有值即使这个值是个空值。对于不接受空值的列就必须为该列输入某个非空值要么由用户明确输入
要么由SQL Server输入默认值。默认值可用于表中的列和用户定义数据类型。请注意缺省约束中使用的缺省值可以由用户创建时输入也可以通过绑定已创建的默认值来指定。在创建默认值时请考虑以下几点默认值需和它要绑定的列或用户定义数据类型具有相同的
数据类型。默认值需符合该列的所有规则。默认值缺省还需符合所有CHECK约束。创建、管理默认值可以用T-SQL语言也可以用企业管理器172. 使用T-SQL语言创建默认值⑴ 创建默认值的语法CREATE DEFAULT default_name AS
constant_expression这里default_name新建默认值的名称它必须遵循SQL Server标识符的命名规则。constant_expression默认值default_name的值是一个常数表达式在这个表达式中不能含有任何列名
或其他数据库对象名但可使用不涉及数据库对象的SQL Server内部函数。默认值创建后可以使用系统存储过程sp_helptext可
以查看用于定义一个默认值的SQL脚本。其语法是
sp_helptext default_name18⑵ 默认值的绑定默认值创建之后只有将其绑定到某个列或用户自定义数
据类型才能有效。使用系统存储过程sp_bindefault可实现与表中的列及用户自定义数据类型的绑定。一个默认值可以绑定到多个列或用户自定义数据类型。绑定默认值的语法是
sp_bindefault default_name, ‘object_name’
其中default_name 由CREATE DEFAULT 语句创建的默认值名
字它将与指定的列或用户定义数据类型相绑定。object_name 要与该默认值相绑定的列名或用户自定义数据类型名。如果指定的是表中的列其格式为‘table_name.column’否则被认为是用户自定义数据类型名。19默认值绑定的几点考虑① 绑定的默认值只适用于受INSERT语句影响的行。
② 不能将默认值绑定到系统数据类型或timestamp列。
③ 若绑定了一个默认值到一用户定义数据类型又给使用该
数据类型的列绑定了一个不同的默认值或规则则绑定到
列的默认值和规则有效。
⑶ 默认值绑定的解除一个默认值被绑定到表中的列或用户自定义的数据类型之后可使用系统存储过程sp_unbinddefault解除其绑定。绑定解
除后作为数据库对象的默认值仍然存在于数据库中。解除默认值绑定的语法是
sp_unbindefault ‘object_name’
object_name 要解除和默认值绑定的表的列名或用户自定
义数据类型名。如果指定的是表中的列其格式为“table_name.column”否则被认为是用户定义数据类型名。20⑷ 默认值绑定的删除如果一个默认值不再使用了可以用DROP语句将其删除。删除默认值的语法是
DROP DEFAULT default_namedefault_name 要删除默认值的名称。在删除默认值时应注意以下几点①DROP将默认值从数据库中删除。
② 如果要删除一个默认值必须解除这个默认值的所
有绑定否则该默认值就不能被删除掉。
③ 在一个批中不能既定义默认值又同时使用默认值。
④ 只有默认值的创建者可以删除默认值。21【例6】 为数据库JWGL创建一个名为profession_default 值为“讲师”的默认值并绑定到表teacher的
profession列然后解除这个绑定绑定解除后将此默认
值删除。
USE JWGL
GO
CREATE DEFAULT profession_default AS '讲师'
GO
sp_bindefault profession_default ,
'teacher.profession'GOsp_unbindefault 'teacher.profession'
DROP DEFAULT profession_defaultGO225.4.5 规则1. 规则的定义规则是数据库对象之一。它指定向表的某列或使用与该规则绑定的用户定义数据类型的所有列插入或更新数据时限制输入新值的取值范围。一个规则可以是值的清单或值的集合;值的范围;必须满足的单值条件;用like子句定义的编辑掩码;规则是实现域完整性的方法之一。规则用来验证一个数据库
中的数据是否处于一个指定的值域范围内是否与特定的格
式相匹配。当数据库中数据值被更新或被插入时就要检查新值是否遵循规则如果不符合规则就拒绝执行此更新或插入的操作。23规则可用于表中列或用户定义数据类型。规则在实现功能上等同于CHECK约束。用CREATE RULE语句创建规则
然后用sp_bindrule把它绑定至一列或用户定义的数据类
型。使用系统存储过程sp_helptext查看用于定义一个规则或缺省的SQL脚本。其语法是
sp_helptext rule_name在创建规则时应考虑以下几点① 缺省情况下规则将检查创建和绑定规则之前输入的数据。
② 规则可以绑定到一列、多列或数据库中的用户定
义数据类型。③ 规则要求一个值在一定范围内并与特定格式相匹配。
④ 在一个列上至多有一个规则起作用如果有多个
规则与一列相绑定那么只有最后绑定到该列的规
则才是有效的。242. 使用T-SQL语言创建、管理规则⑴ 创建规则的语法是CREATE RULE rule_name AS condition_expressionrule_name创建规则的名称应遵循SQL Server标识符的命
名规范。condition_expression指明定义规则的条件在这个条件表
达式中不能包含列名或其他数据库对象名但它带有一个@为前
缀的参数即参数的名字必须以@为第一个字符也称空间标志符( spaceholder)。意即这个规则被附加到这个空间标志符它只在规则定义中引用为数据项值在内存中保留空间以便
与规则作比较。
⑵ 规则的绑定规则创建之后只有将其绑定到某个列或用户自定义数据类型才能有效。使用系统存储过程sp_binderule可实现与表中的列及
用户自定义数据类型的绑定。
绑定规则的语法是sp_bindrule rule_name, object_name25其中rule_name由CREATE RULE语句创建的规则名字它将与指定的列或用户定义数据类型相捆绑。object_name指定要与该规则相绑定的列名或用户定义数据类型名。如果指定的是表中的列其格式为“table.column”否则被认为是用户定义数据类型名。绑定时应注意如下几点① 绑定的缺省只适用于受INSERT语句影响的行。② 绑定的规则只适用于受INSERT和UPDATE语句影响的
行。③ 不能将缺省或规则绑定到系统数据类型或timestamp列。26⑶ 解除规则使用系统存储过程sp_unbindrule可以解除由sp_unbindrule绑定到列或用户定义数据类型的规则。但
被解除的规则仍然存在于数据库中。解除规则的语法如下sp_unbindrule rule_name , object_name
其中rule_name由CREATE RULE语句创建的规则名字它将与
指定的列或用户定义数据类型相捆绑。object_name指定要解除与该规则相绑定的列名或用户
定义数据类型名。如果指定的是表中的列其格式为
table.column否则被认为是用户定义数据类型名。27⑷ 删除规则使用DROP RULE可删除由CREATE RULE命令创建的规则。删除规则的语法如下
DROP RULE [owner.] rule_name
其中rule_name要解除的规则。在删除规则时应注意以下几点
① 使用DROP可将规则从数据库中删除。
② 在删除规则之前需先从列中或用户定义数据类型中
解除绑定。
③ 只有规则定义者可以删除规则。28【例7】 为数据库JWGL创建一个规则grade_rule grade_rule的值大于等于0小于等于100并绑定到表
student_course的grade列然后解除这个绑定绑定解
除后将此规则删除。
USE JWGL
GO
create rule grade_rule as @grade>=0 and
@grade<=100
GO
sp_bindrule grade_rule , 'student_course.grade'GO
sp_unbindrule 'student_course.grade'GOdrop rule grade_rule295.4.6 使用标识列1. 标识列的定义
IDENTITY属性使得某一列的取值是基于上一行的列值和为该
列定义的步长自动生成的。IDENTITY列的值可以唯一地标
识表中的一行可以用于实现实体完整性。有关DENTITY列属性的特点及定义DENTITY列时的注意事项
本章第一节已经介绍。
2. 用T-SQL语言定义标识列⑴ 定义标识列的语法ALETR TABLE table_name
ADD column_name data_type IDENTITY(seed , increment)30table_name要添加标识列的表名。column_name要添加的标识列的名称。data_type要添加的标识列的数据类型。Seed标识列的种子值。Increment标识列的步长。
【例9】给表class增加一个标识列class_no种子值1步长1。USE JWGL
GO
ALTER TABLE class
ADD class_no int IDENTITY(1,1)
3. 用企业管理器定义标识列使用企业管理器定义标识列的方法在已经介绍。本章首页