第5篇完整性约束定义
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
检查约束(CHECK CONSTRAINTS):限制插入列中 的值的范围。
主键约束(PRIMARY KEY CONSTRAINTS):要求主 键的列上没有两行具有相同值,也没有空值。
唯一约束(UNIQUE CONSTRAINTS):要求表中所有 行在指定的列上没有完全相同的列值。
外键约束(FROEIGN KEY CONSTRAINTS):要求正 被插入或更新的列(外键)的新值,必须在被参照表 (主表)的相应列(主键)中已经存在。
USE JWGL GO ALTER TABLE department ADD CONSTRAINT unique_department_name UNIQUE nonclustered (department_name)
12
唯一约束和主键约束的区别: 唯一约束与主键约束都为指定的列建立唯一索引,即不允 许唯一索引的列上有相同的值。主键约束限制更严格,不 但不允许有重复值,而且也不允许有空值。 唯一约束与主键约束产生的索引可以是聚簇索引也可以 是非聚簇索引,但在缺省情况下唯一约束产生非聚簇索引, 主键约束产生聚簇索引。
这里:
default_name:新建默认值的名称,它必须遵循SQL Server标识符的命名规则。
constant_expression:默认值default_name的值, 是一个常数表达式,在这个表达式中不能含有任何列 名或其他数据库对象名,但可使用不涉及数据库对象 的SQL Server内部函数。
CREATE TABLE table_name (column_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] )
7
其中: table_name:创建约束所在的表的名称。 column_name:列名。 data_type:数据类型。 constraint_name:约束名。 在创建、修改、实现约束时注意以下几点:
5
不同的约束强制不同类型的数据完整性。表 中 给出了两者的对应关系。
完整性类型 域完整性
实体完整性 参照完整性
约束类型 非空约束 DEFAULT CHECK PRIMARY KEY UNIQUE FOREIGN KEY
6
2.使用T-SQL语言创建、管理约束 (1)使用CREATE TABLE语句创建约束 使用CREATE TABLE语句创建约束的一般语法如下:
【例2】 为数据库JWGL中表student_course 的GRADE(成绩) 字段创建一个检查约束,使得GRADE的值在0-100之间。 USE JWGL GO ALTER TABLE student_course ADD CONSTRAINT check_grade CHECK (grade>=0 and grade<=100)
数据类型。 默认值需符合该列的所有规则。 默认值缺省还需符合所有CHECK约束。 创建、管理默认值可以用T-SQL语言也可以用企业管理器
16
2. 使用T-SQL语言创建默认值:
⑴ 创建默认值的语法
CREATE DEFAULT default_name AS constant_expression
11
⑸ 唯一约束 唯一约束限制表中指定列上所有的非空值必须唯一,
即表中任意两行在指定列上都不允许有相同的值。 创建UNIQUE约束时应考虑以下因素:
一个表可以放置多个UNIQUE约束 允许有空值 创建唯一索引时强制UNIQUE约束
【例4】 将数据库JWGL中teacher表的teacher_id(教师 号)字段设为唯一约束。
默认值创建后,可以使用系统存储过程sp_helptext可 以查看用于定义一个默认值的SQL脚本。其语法是:
声明型数据完整性作为数据库对象说明的一部分在语法中实现, 在CREATE TABLE和ALTER TABLE定义中使用CONSTRAINT、 DEFAULT等语句限制表中的值。使用这种方法实现数据完整性 简单且不易出错,系统直接将实现数据完整性的要求定义在表 和列上。
2. 过程型数据完整性
过程型数据完整性是指由某个过程引发而实施的数据完整性。 一般先写出实施数据完整性的条件,再写出强制该条件所执行 的用于保证数据完整性的脚本。通常由触发器和存储过程实现。 过程型数据完整性也可以在客户机和服务器上使用其它编程语 言和工具实现。
【例5】为表teacher创建外键department_id,外键 department_id参考表department中的主键department_id。 USE JWGL GO ALTER TABLE teacher ADD CONSTRAINT FK_department_id FOREIGN KEY (department_id) REFERENCES department(department_id) GO
3. 参照完整性
参照完整性也叫引用完整性。参照完整性总是保证主关键字 (被引用表)和外部关键字(引用表)之间的参照关系。它涉 及两个或两个以上表数据的一致性维护。
2
5.4.2 数据完整性实施方法
1. 声明型数据完整性
声明型数据完整性一般在对象创建时定义,由SQL Server强制 实施,通常使用约束、缺省值和规则来实现。实现基本数据完 整性的首选方法是使用声明型数据完整性。
创建检查约束
创建主键约束 创建唯一性约束
创建外键约束
15
5.4.4 使用默认值 1. 默认值的定义 默认值是数据库对象之一,它指定在向数据库中的表插入数
据时,如果用户没有明确给出某列的值,SQL Server自动为 该列使用此默认值。 它是实现数据完整性的方法之一。在关系数据库中,每个列 都必须包含有值,即使这个值是个空值。对于不接受空值的 列,就必须为该列输入某个非空值,要么由用户明确输入, 要么由SQL Server输入默认值。 默认值可用于表中的列和用户定义数据类型。请注意,缺省 约束中使用的缺省值可以由用户创建时输入,也可以通过绑 定已创建的默认值来指定。 在创建默认值时,请考虑以下几点: 默认值需和它要绑定的列或用户定义数据类型具有相同的
⑹ 外键约束 通过外键约束强制参照完整性。SQL Server提供了外键/主
键值约束。即满足以下两点: ① 存在外键时,被参照表中这一行不能删除。 ② 向子表插入记录或更新子表中外键值的前提是,必须保
证这个外键值与主表中主键的某个值相等或者该外键值为 空,否则不允许插入或修改外键值。
13
创建FOREIGN KEY约束时应考虑以下因素: 它提供一列或多列数据的参照完整性。 FOREIGN KEY约束不自动创建索引。但如果考虑数据库的 多表连接,建议为外键创建一个索引,以提高连接性能 主键与外键的数据类型和长度必须一致,或系统可转换
9
⑶ 检查约束
检查约束用来指定某列可取值的清单、可取值的集合或可取值的 范围。检查约束主要用于实现域完整性。
创建CHECK约束时应考虑以下因素: 当向数据库中的表执行插入或更新操作时,检查插入的新列 值是否满足CHECK约束条件 不能在具有IDENTITY属性,或具有timestamp或 uniqueidentifier数据类型的列上放置CHECK约束 CHECK条件不能含有子查询
1
1. 域完整性
域完整性是指一个列的输入有效性,是否允许空值。强制域完 整性的方法有:限制类型(通过设定列的数据类型)、格式 (通过CHECK约束和规则)或可能值的范围(通过 FOREIGN KEY 约束、CHECK 约束、DEFAULT定义、NOT NULL定义和 规则)。
2. 实体完整性
实体完整性是指保证表中所有的行唯一。实体完整性要求表中 的所有行都有一个唯一标识符。这个唯一标识符可能是一列, 也可能是几列的组合,称之为主键。也就是说,表中主键在所 有行上必须取值唯一。强制实体完整性的方法有:索引、 UNIQUE约束、PRIMARY KEY约束或 IDENTITY属性 。
唯一约束、外键约束(参照约束)。 非空约束(NOT NULL):表中的某些列必须存在有效值,不允
许有空值出现。这是最简单的数据完整性约束,可在建表时将该 列声明为NOT NULL即可。 缺省约束(DEwenku.baidu.comALUT CONSTRAINTS):当向数据库中的表插 入数据时,如果用户没有明确给出某列的值,SQL Server自动为 该列输入指定值。
10
⑷ 主键约束 主键约束保证某一列或一组列值的组合相对于表中的每一行都是唯一的,
主键约束创建在表的主键列上,它对实现实体完整性更加有用。主键约 束的作用就是为表创建主键。 创建PRIMARY KEY约束时应考虑以下因素: 每个表只能有一个主键,并且必须有一个主键 ; 不允许有空值; 参照约束使用它作为维护参照完整性的参考点; 创建主键时,在创建主键的列上创建了一个唯一索引,可以是聚簇
3
5.4.3 约束
1.约束的定义和类型 约束是SQL Server提供的自动保持数据库完整性的一种方法 。 列级约束:列级约束是行定义的一部分,只能够应用在一列上。 表级约束:表级约束的定义独立于列的定义,可以应用在一个表
中的多列上。 约束有六种类型:非空约束、缺省约束、检查约束、主键约束、
14
3. 使用企业管理器管理约束
创建缺省约束 创建缺省约束的具体步骤如下: ① 启动企业管理器。 ② 分别点击“数据库”、“JWGL”、“表”,显示数据库 JWGL中所有的表。 ③ 右击要设置缺省的表(假设要设置缺省的表为teacher), 在系统弹出的快捷菜单上点击“设计表”, ④ 点击设置缺省的列,在下面列属性设置栏的默认值输入 框中,输入对应缺省值即可。
① 可以在已有的表上创建、修改、删除约束,而不必删 除并重建表。
② 可以在应用程序中创建错误检查逻辑,测试是否违反 约束。
③ 在给表添加约束时,SQL将验证表中已有数据是否满 足正在添加的约束。
8
⑵ 缺省约束 缺省约束是指当向数据库中的表插入数据时,如果用户
没有明确给出某列的值时,SQL Server自动为该列输入 的值,缺省约束用于实现域的完整性。 创建DEFAULT约束时应考虑以下因素: DEFAULT约束只能用于INSERT语句 不能用于具有IDENTITY属性的列 每列只能有一个DEFAULT约束 【例1】 为数据库JWGL中表teacher的SEX(性别)字段 创建一个缺省约束,缺省值为1(男) USE JWGL GO ALTER TABLE teacher ADD CONSTRAINT default_sex DEFAULT 1 FOR SEX
5.4 数据完整性的概念与实施方法
5.4.1 数据完整性概念 数据完整性是指数据的正确性、完备性和一致性,是
衡量数据库质量好坏的重要标准。 在用INSERT、DELETE、UPDATE语句修改数据库内容
时,数据的完整性可能会遭到破坏。可能会存在下列 情况:无效的数据被添加到数据库的表中。如:将学 生考试成绩输入成负数; SQL Server提供了对数据库中表、列实施数据完整性 的方法。对表进行设计数据完整性有两个重要内容: 标识列的有效值和确定如何强制列中的数据完整性。
索引,也可以是非聚簇索引,默认是聚簇索引。 【例3】 将数据库JWGL中teacher表的teacher_id(教师号)字段设为主
键。 USE JWGL GO ALTER TABLE teacher ADD CONSTRAINT PK_teacher_id PRIMARY KEY clustered (teacher_id)
检查约束(CHECK CONSTRAINTS):限制插入列中 的值的范围。
主键约束(PRIMARY KEY CONSTRAINTS):要求主 键的列上没有两行具有相同值,也没有空值。
唯一约束(UNIQUE CONSTRAINTS):要求表中所有 行在指定的列上没有完全相同的列值。
外键约束(FROEIGN KEY CONSTRAINTS):要求正 被插入或更新的列(外键)的新值,必须在被参照表 (主表)的相应列(主键)中已经存在。
USE JWGL GO ALTER TABLE department ADD CONSTRAINT unique_department_name UNIQUE nonclustered (department_name)
12
唯一约束和主键约束的区别: 唯一约束与主键约束都为指定的列建立唯一索引,即不允 许唯一索引的列上有相同的值。主键约束限制更严格,不 但不允许有重复值,而且也不允许有空值。 唯一约束与主键约束产生的索引可以是聚簇索引也可以 是非聚簇索引,但在缺省情况下唯一约束产生非聚簇索引, 主键约束产生聚簇索引。
这里:
default_name:新建默认值的名称,它必须遵循SQL Server标识符的命名规则。
constant_expression:默认值default_name的值, 是一个常数表达式,在这个表达式中不能含有任何列 名或其他数据库对象名,但可使用不涉及数据库对象 的SQL Server内部函数。
CREATE TABLE table_name (column_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] )
7
其中: table_name:创建约束所在的表的名称。 column_name:列名。 data_type:数据类型。 constraint_name:约束名。 在创建、修改、实现约束时注意以下几点:
5
不同的约束强制不同类型的数据完整性。表 中 给出了两者的对应关系。
完整性类型 域完整性
实体完整性 参照完整性
约束类型 非空约束 DEFAULT CHECK PRIMARY KEY UNIQUE FOREIGN KEY
6
2.使用T-SQL语言创建、管理约束 (1)使用CREATE TABLE语句创建约束 使用CREATE TABLE语句创建约束的一般语法如下:
【例2】 为数据库JWGL中表student_course 的GRADE(成绩) 字段创建一个检查约束,使得GRADE的值在0-100之间。 USE JWGL GO ALTER TABLE student_course ADD CONSTRAINT check_grade CHECK (grade>=0 and grade<=100)
数据类型。 默认值需符合该列的所有规则。 默认值缺省还需符合所有CHECK约束。 创建、管理默认值可以用T-SQL语言也可以用企业管理器
16
2. 使用T-SQL语言创建默认值:
⑴ 创建默认值的语法
CREATE DEFAULT default_name AS constant_expression
11
⑸ 唯一约束 唯一约束限制表中指定列上所有的非空值必须唯一,
即表中任意两行在指定列上都不允许有相同的值。 创建UNIQUE约束时应考虑以下因素:
一个表可以放置多个UNIQUE约束 允许有空值 创建唯一索引时强制UNIQUE约束
【例4】 将数据库JWGL中teacher表的teacher_id(教师 号)字段设为唯一约束。
默认值创建后,可以使用系统存储过程sp_helptext可 以查看用于定义一个默认值的SQL脚本。其语法是:
声明型数据完整性作为数据库对象说明的一部分在语法中实现, 在CREATE TABLE和ALTER TABLE定义中使用CONSTRAINT、 DEFAULT等语句限制表中的值。使用这种方法实现数据完整性 简单且不易出错,系统直接将实现数据完整性的要求定义在表 和列上。
2. 过程型数据完整性
过程型数据完整性是指由某个过程引发而实施的数据完整性。 一般先写出实施数据完整性的条件,再写出强制该条件所执行 的用于保证数据完整性的脚本。通常由触发器和存储过程实现。 过程型数据完整性也可以在客户机和服务器上使用其它编程语 言和工具实现。
【例5】为表teacher创建外键department_id,外键 department_id参考表department中的主键department_id。 USE JWGL GO ALTER TABLE teacher ADD CONSTRAINT FK_department_id FOREIGN KEY (department_id) REFERENCES department(department_id) GO
3. 参照完整性
参照完整性也叫引用完整性。参照完整性总是保证主关键字 (被引用表)和外部关键字(引用表)之间的参照关系。它涉 及两个或两个以上表数据的一致性维护。
2
5.4.2 数据完整性实施方法
1. 声明型数据完整性
声明型数据完整性一般在对象创建时定义,由SQL Server强制 实施,通常使用约束、缺省值和规则来实现。实现基本数据完 整性的首选方法是使用声明型数据完整性。
创建检查约束
创建主键约束 创建唯一性约束
创建外键约束
15
5.4.4 使用默认值 1. 默认值的定义 默认值是数据库对象之一,它指定在向数据库中的表插入数
据时,如果用户没有明确给出某列的值,SQL Server自动为 该列使用此默认值。 它是实现数据完整性的方法之一。在关系数据库中,每个列 都必须包含有值,即使这个值是个空值。对于不接受空值的 列,就必须为该列输入某个非空值,要么由用户明确输入, 要么由SQL Server输入默认值。 默认值可用于表中的列和用户定义数据类型。请注意,缺省 约束中使用的缺省值可以由用户创建时输入,也可以通过绑 定已创建的默认值来指定。 在创建默认值时,请考虑以下几点: 默认值需和它要绑定的列或用户定义数据类型具有相同的
⑹ 外键约束 通过外键约束强制参照完整性。SQL Server提供了外键/主
键值约束。即满足以下两点: ① 存在外键时,被参照表中这一行不能删除。 ② 向子表插入记录或更新子表中外键值的前提是,必须保
证这个外键值与主表中主键的某个值相等或者该外键值为 空,否则不允许插入或修改外键值。
13
创建FOREIGN KEY约束时应考虑以下因素: 它提供一列或多列数据的参照完整性。 FOREIGN KEY约束不自动创建索引。但如果考虑数据库的 多表连接,建议为外键创建一个索引,以提高连接性能 主键与外键的数据类型和长度必须一致,或系统可转换
9
⑶ 检查约束
检查约束用来指定某列可取值的清单、可取值的集合或可取值的 范围。检查约束主要用于实现域完整性。
创建CHECK约束时应考虑以下因素: 当向数据库中的表执行插入或更新操作时,检查插入的新列 值是否满足CHECK约束条件 不能在具有IDENTITY属性,或具有timestamp或 uniqueidentifier数据类型的列上放置CHECK约束 CHECK条件不能含有子查询
1
1. 域完整性
域完整性是指一个列的输入有效性,是否允许空值。强制域完 整性的方法有:限制类型(通过设定列的数据类型)、格式 (通过CHECK约束和规则)或可能值的范围(通过 FOREIGN KEY 约束、CHECK 约束、DEFAULT定义、NOT NULL定义和 规则)。
2. 实体完整性
实体完整性是指保证表中所有的行唯一。实体完整性要求表中 的所有行都有一个唯一标识符。这个唯一标识符可能是一列, 也可能是几列的组合,称之为主键。也就是说,表中主键在所 有行上必须取值唯一。强制实体完整性的方法有:索引、 UNIQUE约束、PRIMARY KEY约束或 IDENTITY属性 。
唯一约束、外键约束(参照约束)。 非空约束(NOT NULL):表中的某些列必须存在有效值,不允
许有空值出现。这是最简单的数据完整性约束,可在建表时将该 列声明为NOT NULL即可。 缺省约束(DEwenku.baidu.comALUT CONSTRAINTS):当向数据库中的表插 入数据时,如果用户没有明确给出某列的值,SQL Server自动为 该列输入指定值。
10
⑷ 主键约束 主键约束保证某一列或一组列值的组合相对于表中的每一行都是唯一的,
主键约束创建在表的主键列上,它对实现实体完整性更加有用。主键约 束的作用就是为表创建主键。 创建PRIMARY KEY约束时应考虑以下因素: 每个表只能有一个主键,并且必须有一个主键 ; 不允许有空值; 参照约束使用它作为维护参照完整性的参考点; 创建主键时,在创建主键的列上创建了一个唯一索引,可以是聚簇
3
5.4.3 约束
1.约束的定义和类型 约束是SQL Server提供的自动保持数据库完整性的一种方法 。 列级约束:列级约束是行定义的一部分,只能够应用在一列上。 表级约束:表级约束的定义独立于列的定义,可以应用在一个表
中的多列上。 约束有六种类型:非空约束、缺省约束、检查约束、主键约束、
14
3. 使用企业管理器管理约束
创建缺省约束 创建缺省约束的具体步骤如下: ① 启动企业管理器。 ② 分别点击“数据库”、“JWGL”、“表”,显示数据库 JWGL中所有的表。 ③ 右击要设置缺省的表(假设要设置缺省的表为teacher), 在系统弹出的快捷菜单上点击“设计表”, ④ 点击设置缺省的列,在下面列属性设置栏的默认值输入 框中,输入对应缺省值即可。
① 可以在已有的表上创建、修改、删除约束,而不必删 除并重建表。
② 可以在应用程序中创建错误检查逻辑,测试是否违反 约束。
③ 在给表添加约束时,SQL将验证表中已有数据是否满 足正在添加的约束。
8
⑵ 缺省约束 缺省约束是指当向数据库中的表插入数据时,如果用户
没有明确给出某列的值时,SQL Server自动为该列输入 的值,缺省约束用于实现域的完整性。 创建DEFAULT约束时应考虑以下因素: DEFAULT约束只能用于INSERT语句 不能用于具有IDENTITY属性的列 每列只能有一个DEFAULT约束 【例1】 为数据库JWGL中表teacher的SEX(性别)字段 创建一个缺省约束,缺省值为1(男) USE JWGL GO ALTER TABLE teacher ADD CONSTRAINT default_sex DEFAULT 1 FOR SEX
5.4 数据完整性的概念与实施方法
5.4.1 数据完整性概念 数据完整性是指数据的正确性、完备性和一致性,是
衡量数据库质量好坏的重要标准。 在用INSERT、DELETE、UPDATE语句修改数据库内容
时,数据的完整性可能会遭到破坏。可能会存在下列 情况:无效的数据被添加到数据库的表中。如:将学 生考试成绩输入成负数; SQL Server提供了对数据库中表、列实施数据完整性 的方法。对表进行设计数据完整性有两个重要内容: 标识列的有效值和确定如何强制列中的数据完整性。
索引,也可以是非聚簇索引,默认是聚簇索引。 【例3】 将数据库JWGL中teacher表的teacher_id(教师号)字段设为主
键。 USE JWGL GO ALTER TABLE teacher ADD CONSTRAINT PK_teacher_id PRIMARY KEY clustered (teacher_id)