第9章数据完整性方案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
66
9.1 数据完整性
SQL Server 2005中的数据完整性
各类数据完整性和对应实现完整性的SQL Server组件如表9.1所示 。
数据完整性
对应的SQL Server组件
实体完整性 域完整性 参照完整性 用户定义完整性
PRIMARY KEY(主键)约束、UNIQUE(唯一) 约束UNIQUE INDEX(唯一索引)、 IDENTITY COLUMN(标识列)
18 18
9.2 约束
②定义表级主键约束 语法格式如下。 [ CONSTRAINT constraint_name ] PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] ( column_name [ ,...n ] ) 其中,column_name [ ,...n ]指定组成主键的列名,n最大 值为16。
ALTER TABLE table_name DROP CONSTRAINT
constraint_name
21 21
9.2 约束
外键约束
通过将用于保存表中主键值的一列或多列添加到另一个 表中,可创建两个表之间的链接。这个列就成为第二个表的 外键。
外键用于建立和加强两个表数据之间的链接的一列或多 列。
88
9.1 数据完整性
(2) 约束 约束定义关于列中允许值的规则,是强制实施完整性的 标准机制。使用约束优先于使用DML触发器、规则和默认 值。 约束类型 SQL Server 2005有下列约束类型 : a. NOT NULL约束 :非空约束,指定列不接受NULL值 . b. CHECK约束 :检查约束,通过限制可输入到列中的值 来强制实施域完整性 。 c. UNIQUE约束:唯一约束,强制实施列取值集合中值的 唯一性。主键强制实施唯一性,但主键不允许NULL作为一 个唯一值。
第9章 数据完整性
11
本章内容
9.1 数据完整性 9.2 约束 9.3 规则 9.4 默认值
22
9.1 数据完整性
数据完整性是指数据库中存储数据的一致性和正确性, 确保各个文件或表中的数据值的关系一致,确保数据库中的 数据可以成功和正确地更新 。
数据库设计的一项重要内容是确定如何加强数据的完整 性。
20 20
9.2 约束
例如:假设在teaching数据库中的s_c表中没有设置主键 约束,以下示例通过ALTER TABLE命令添加主键约束 。
USE teaching
GO
ALTER TABLE s_c
ADD CONSTRAINT PK_sc PRIMARY KEY (SNO, CNO)
GO
通过ALTER TABLE命令也可以删除不使用的主键约束, 命令格式如下。
12 12
9.2 约束
约束是通过限制字段中数据、记录中数据和表之间的数 据来保证数据完整性 。
约束独立于表结构,创建约束有两种方法 : 创建表时在CREATE TABLE命令中声明; 在不改变表结构的基础上,通过修改表结构命令ALTER TABLE添加或删除 。
当表被删除时,表所带的所有约束定义也随之被删除。
9.1 数据完整性
(1) 空值 数据表中的列可以接受空值,也可以拒绝空值。在数据 库中,NULL是一个特殊值,表示未知值的概念。 NULL不同于空字符或0。空字符是一个有效的字符,0是 一个有效的数字。NULL只是表示此值未知这一概念。 NULL也不同于零长度字符串(空串)。 如果列定义中包含NOT NULL子句,则不能为该列输入 NULL值。如果列定义中仅包含NULL关键字,则接受 NULL值
11 11
9.1 数据完整性
(4) 默认值 如果插入行时没有为列指定值,默认值则指定列中默认 取值。默认值可以是计算结果为常量的任何值,例如常量、 内置函数或数学表达式。 若要应用默认值,可以通过在CREATE TABLE中使用 DEFAULT关键字来创建默认值定义。这将为每一列分配一 个常量表达式作为默认值,也可以作为单独的对象创建,然 后绑定到列上。
通过它可强制表的实体完整性,以确保数据表中数据的 唯一性 。
当创建或更改表时,可通过定义PRIMARY KEY (主键) 约束来创建主键。
15 15
9.2 约束
对于主键约束,需满足以下规则。 一个表只能包含一个PRIMARY KEY约束。 由PRIMARY KEY约束生成的索引不会使表中的非 聚集索引超过249个,聚集索引超过1个。 如果没有为PRIMARY KEY约束指定CLUSTERED 或NONCLUSTERED,并且没有为UNIQUE约束指定 聚集索引,则将对该PRIMARY KEY约束使用 CLUSTERED。 在PRIMARY KEY约束中定义的所有列都必须定义 为NOT NULL。如果没有指定为空性,则加入 PRIMARY KEY约束的所有列的为空性都将设置为 NOT NULL。
10 10
9.1 数据完整性
(3) 规则 规则用于执行一些与CHECK约束相同的功能。使用 CHECK约束是限制列值的首选标准方法。CHECK约束还 比规则更简明。一个列只能应用一个规则,但可以应用多个 CHECK约束。CHECK约束被指定为CREATE TABLE语句 的一部分,而规则是作为单独的对象创建,然后绑定到列上。
55Βιβλιοθήκη Baidu
9.1 数据完整性
声明数据完整性 声明数据完整性是通过在对象定义中定义的标准来实现
数据完整性,是由系统本身的自动强制来实现的,它包括使 用各种约束、缺省的规则。 过程数据完整性
过程数据完整性是通过在脚本语言中定义的完整性标准 来实现的,当执行这些脚本时,就可以强制完整性的实现 。
过程数据完整性的方式包括使用触发器和存储过程等。
当创建或更改表时,可以通过定义FOREIGN KEY约束 来创建外键。
22 22
9.2 约束
对于外键约束,需要满足以下规则。 如果在FOREIGN KEY约束的列中输入非NULL值,则此值必 须在被引用列中存在;否则,将返回违反外键约束的错误信息。 FOREIGN KEY约束仅能引用位于同一服务器上的同一数据 库中的表。跨数据库的参照完整性必须通过触发器实现。 FOREIGN KEY约束可引用同一表中的其他列,此行为称为 自引用。 列级FOREIGN KEY约束的REFERENCES子句只能列出一个 引用列。此列的数据类型必须与定义约束的列的数据类型相同。 表级FOREIGN KEY约束的REFERENCES子句中引用列的数 目必须与约束列列表中的列数相同。每个引用列的数据类型也必 须与列表中相应列的数据类型相同。 FOREIGN KEY约束只能引用所参照的表的PRIMARY KEY 或UNIQUE约束中的列或所引用的表上UNIQUE INDEX中的列。
DEFAULT(默认值)、CHECK(检查)约束、 RULE(规则)FOREIGN KEY(外键)约束、 DATA TYPE(数据类型)
FOREIGN KEY (外键)约束、CHECK (检查) 约束TRIGGER(触发器)、STORED PROCEDURE(存储过程)
RULE(规则)、TRIGGER(触发器)、 7 7 STORED PROCEDURE(存储过程)
99
9.1 数据完整性
d. PRIMARY KEY约束:主键约束,标识具有唯一标识 表中行的值的列或列集 。
e. FOREIGN KEY约束:外键约束,标识并强制实施表 之间的关系 。 列约束和表约束
列约束指定为列定义的一部分,并且只应用于该列。表 约束的声明与列定义无关,可以应用于表中多个列 。当一个 约束中必须包含多个列时,应使用表约束。
ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }:指定如果已创建表中的行具有引用关系, 并且被引用行已从父表中删除,则对这些行采取的操作。默 认值为NO ACTION。
23 23
9.2 约束
(1) 创建表时声明外键约束 语法格式如下。 [ CONSTRAINT constraint_name ] FOREIGN KEY REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ] [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
33
9.1 数据完整性
关系数据完整性
关系数据完整性包括一下内容:
(1) 实体完整性 实体完整性就是把表中每一条记录看作一个实体,要求 所有行都具有唯一标识,即主键,且主键的值非空,又称为 行完整性 。
(2) 域完整性 域完整性是关于数据列取值有效性的限制 。域完整性通 常用有效性检查来实现,也可以通过限制数据类型、格式或 者可能的取值范围来实现 。
例如,对于teaching数据库中s_c表中,GRADE字段的取 值只能是从0到100的整数值,而不能为其他数值 。
44
9.1 数据完整性
(3) 参照完整性 参照完整性是对外键取值有效性的限制,以确保数据在 另一个参照表的取值范围内 。参照完整性要求外键的取值只 能取参照表中的有效值或空值 。如果在参考表中某一记录的 主键被依赖表中的外部键参考,那么这一记录既不能删除, 也不能修改其主键值,以确保关键字的一致性 。 (4) 用户定义完整性 用户定义完整性允许特定的不属于上述类别规则的完整 性定义,前面的3个完整性类型都支持用户定义完整性。 实现用户定义完整性,可以有两种方法,即声明数据完 整性和过程数据完整性。
19 19
9.2 约束
(2) 修改表时创建主键约束 语法格式如下。 ALTER TABLE table_name ADD CONSTRAINT Constraint_name PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] ( column_name [,…n] )
13 13
9.2 约束
表9.2 所有可用的约束类型
完整性类型
约束类型
域完整性 实体完整性 参照完整性
DEFAULT(默认值)、CHECK(检 查)约束
PRIMARY KEY(主键)约束、 UNIQUE(唯一)约束
FOREIGN KEY(外键)约束
14 14
9.2 约束
主键约束
在数据表中经常有一列或多列的组合,其值能唯一地标 识表中的每一行。这样的一列或多列称为表的主键 。
17 17
9.2 约束
CONSTRAINT:可选关键字,表示PRIMARY KEY、 NOT NULL、UNIQUE、FOREIGN KEY或CHECK约束定 义的开始 。 constraint_name:约束的名称。约束名称必须在表所属 的架构中唯一。 PRIMARY KEY:是通过唯一索引对给定的一列或多列 强制实体完整性的约束。每个表只能创建一个 PRIMARY KEY 约束 。 CLUSTERED | NONCLUSTERED:指示为PRIMARY KEY约束创建聚集索引还是非聚集索引。PRIMARY KEY 约束默认为CLUSTERED。
16 16
9.2 约束
(1) 创建表时声明主键约束 如果表的主键由单列组成,则该主键约束可以定义为该 列的列约束。如果主键由两个以上的列组成,则该主键约束 必须定义为表约束 。 ①定义列级主键约束 语法格式如下: [ CONSTRAINT constraint_name ] PRIMARY KEY [ CLUSTERED | NONCLUSTERED ]
24 24
9.2 约束
FOREIGN KEY REFERENCES:为列中的数据提供参 照完整性的约束。FOREIGN KEY 约束要求列中的每个值 在所引参照的表中对应的被引用列中都存在。 [ schema_name . ] referenced_table_name:是FOREIGN KEY约束参照的表的名称,以及该表所属架构的名称。 ( ref_column [ ,... n ] ):是FOREIGN KEY约束所引用的 表中的一列或多列 。
9.1 数据完整性
SQL Server 2005中的数据完整性
各类数据完整性和对应实现完整性的SQL Server组件如表9.1所示 。
数据完整性
对应的SQL Server组件
实体完整性 域完整性 参照完整性 用户定义完整性
PRIMARY KEY(主键)约束、UNIQUE(唯一) 约束UNIQUE INDEX(唯一索引)、 IDENTITY COLUMN(标识列)
18 18
9.2 约束
②定义表级主键约束 语法格式如下。 [ CONSTRAINT constraint_name ] PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] ( column_name [ ,...n ] ) 其中,column_name [ ,...n ]指定组成主键的列名,n最大 值为16。
ALTER TABLE table_name DROP CONSTRAINT
constraint_name
21 21
9.2 约束
外键约束
通过将用于保存表中主键值的一列或多列添加到另一个 表中,可创建两个表之间的链接。这个列就成为第二个表的 外键。
外键用于建立和加强两个表数据之间的链接的一列或多 列。
88
9.1 数据完整性
(2) 约束 约束定义关于列中允许值的规则,是强制实施完整性的 标准机制。使用约束优先于使用DML触发器、规则和默认 值。 约束类型 SQL Server 2005有下列约束类型 : a. NOT NULL约束 :非空约束,指定列不接受NULL值 . b. CHECK约束 :检查约束,通过限制可输入到列中的值 来强制实施域完整性 。 c. UNIQUE约束:唯一约束,强制实施列取值集合中值的 唯一性。主键强制实施唯一性,但主键不允许NULL作为一 个唯一值。
第9章 数据完整性
11
本章内容
9.1 数据完整性 9.2 约束 9.3 规则 9.4 默认值
22
9.1 数据完整性
数据完整性是指数据库中存储数据的一致性和正确性, 确保各个文件或表中的数据值的关系一致,确保数据库中的 数据可以成功和正确地更新 。
数据库设计的一项重要内容是确定如何加强数据的完整 性。
20 20
9.2 约束
例如:假设在teaching数据库中的s_c表中没有设置主键 约束,以下示例通过ALTER TABLE命令添加主键约束 。
USE teaching
GO
ALTER TABLE s_c
ADD CONSTRAINT PK_sc PRIMARY KEY (SNO, CNO)
GO
通过ALTER TABLE命令也可以删除不使用的主键约束, 命令格式如下。
12 12
9.2 约束
约束是通过限制字段中数据、记录中数据和表之间的数 据来保证数据完整性 。
约束独立于表结构,创建约束有两种方法 : 创建表时在CREATE TABLE命令中声明; 在不改变表结构的基础上,通过修改表结构命令ALTER TABLE添加或删除 。
当表被删除时,表所带的所有约束定义也随之被删除。
9.1 数据完整性
(1) 空值 数据表中的列可以接受空值,也可以拒绝空值。在数据 库中,NULL是一个特殊值,表示未知值的概念。 NULL不同于空字符或0。空字符是一个有效的字符,0是 一个有效的数字。NULL只是表示此值未知这一概念。 NULL也不同于零长度字符串(空串)。 如果列定义中包含NOT NULL子句,则不能为该列输入 NULL值。如果列定义中仅包含NULL关键字,则接受 NULL值
11 11
9.1 数据完整性
(4) 默认值 如果插入行时没有为列指定值,默认值则指定列中默认 取值。默认值可以是计算结果为常量的任何值,例如常量、 内置函数或数学表达式。 若要应用默认值,可以通过在CREATE TABLE中使用 DEFAULT关键字来创建默认值定义。这将为每一列分配一 个常量表达式作为默认值,也可以作为单独的对象创建,然 后绑定到列上。
通过它可强制表的实体完整性,以确保数据表中数据的 唯一性 。
当创建或更改表时,可通过定义PRIMARY KEY (主键) 约束来创建主键。
15 15
9.2 约束
对于主键约束,需满足以下规则。 一个表只能包含一个PRIMARY KEY约束。 由PRIMARY KEY约束生成的索引不会使表中的非 聚集索引超过249个,聚集索引超过1个。 如果没有为PRIMARY KEY约束指定CLUSTERED 或NONCLUSTERED,并且没有为UNIQUE约束指定 聚集索引,则将对该PRIMARY KEY约束使用 CLUSTERED。 在PRIMARY KEY约束中定义的所有列都必须定义 为NOT NULL。如果没有指定为空性,则加入 PRIMARY KEY约束的所有列的为空性都将设置为 NOT NULL。
10 10
9.1 数据完整性
(3) 规则 规则用于执行一些与CHECK约束相同的功能。使用 CHECK约束是限制列值的首选标准方法。CHECK约束还 比规则更简明。一个列只能应用一个规则,但可以应用多个 CHECK约束。CHECK约束被指定为CREATE TABLE语句 的一部分,而规则是作为单独的对象创建,然后绑定到列上。
55Βιβλιοθήκη Baidu
9.1 数据完整性
声明数据完整性 声明数据完整性是通过在对象定义中定义的标准来实现
数据完整性,是由系统本身的自动强制来实现的,它包括使 用各种约束、缺省的规则。 过程数据完整性
过程数据完整性是通过在脚本语言中定义的完整性标准 来实现的,当执行这些脚本时,就可以强制完整性的实现 。
过程数据完整性的方式包括使用触发器和存储过程等。
当创建或更改表时,可以通过定义FOREIGN KEY约束 来创建外键。
22 22
9.2 约束
对于外键约束,需要满足以下规则。 如果在FOREIGN KEY约束的列中输入非NULL值,则此值必 须在被引用列中存在;否则,将返回违反外键约束的错误信息。 FOREIGN KEY约束仅能引用位于同一服务器上的同一数据 库中的表。跨数据库的参照完整性必须通过触发器实现。 FOREIGN KEY约束可引用同一表中的其他列,此行为称为 自引用。 列级FOREIGN KEY约束的REFERENCES子句只能列出一个 引用列。此列的数据类型必须与定义约束的列的数据类型相同。 表级FOREIGN KEY约束的REFERENCES子句中引用列的数 目必须与约束列列表中的列数相同。每个引用列的数据类型也必 须与列表中相应列的数据类型相同。 FOREIGN KEY约束只能引用所参照的表的PRIMARY KEY 或UNIQUE约束中的列或所引用的表上UNIQUE INDEX中的列。
DEFAULT(默认值)、CHECK(检查)约束、 RULE(规则)FOREIGN KEY(外键)约束、 DATA TYPE(数据类型)
FOREIGN KEY (外键)约束、CHECK (检查) 约束TRIGGER(触发器)、STORED PROCEDURE(存储过程)
RULE(规则)、TRIGGER(触发器)、 7 7 STORED PROCEDURE(存储过程)
99
9.1 数据完整性
d. PRIMARY KEY约束:主键约束,标识具有唯一标识 表中行的值的列或列集 。
e. FOREIGN KEY约束:外键约束,标识并强制实施表 之间的关系 。 列约束和表约束
列约束指定为列定义的一部分,并且只应用于该列。表 约束的声明与列定义无关,可以应用于表中多个列 。当一个 约束中必须包含多个列时,应使用表约束。
ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }:指定如果已创建表中的行具有引用关系, 并且被引用行已从父表中删除,则对这些行采取的操作。默 认值为NO ACTION。
23 23
9.2 约束
(1) 创建表时声明外键约束 语法格式如下。 [ CONSTRAINT constraint_name ] FOREIGN KEY REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ] [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
33
9.1 数据完整性
关系数据完整性
关系数据完整性包括一下内容:
(1) 实体完整性 实体完整性就是把表中每一条记录看作一个实体,要求 所有行都具有唯一标识,即主键,且主键的值非空,又称为 行完整性 。
(2) 域完整性 域完整性是关于数据列取值有效性的限制 。域完整性通 常用有效性检查来实现,也可以通过限制数据类型、格式或 者可能的取值范围来实现 。
例如,对于teaching数据库中s_c表中,GRADE字段的取 值只能是从0到100的整数值,而不能为其他数值 。
44
9.1 数据完整性
(3) 参照完整性 参照完整性是对外键取值有效性的限制,以确保数据在 另一个参照表的取值范围内 。参照完整性要求外键的取值只 能取参照表中的有效值或空值 。如果在参考表中某一记录的 主键被依赖表中的外部键参考,那么这一记录既不能删除, 也不能修改其主键值,以确保关键字的一致性 。 (4) 用户定义完整性 用户定义完整性允许特定的不属于上述类别规则的完整 性定义,前面的3个完整性类型都支持用户定义完整性。 实现用户定义完整性,可以有两种方法,即声明数据完 整性和过程数据完整性。
19 19
9.2 约束
(2) 修改表时创建主键约束 语法格式如下。 ALTER TABLE table_name ADD CONSTRAINT Constraint_name PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] ( column_name [,…n] )
13 13
9.2 约束
表9.2 所有可用的约束类型
完整性类型
约束类型
域完整性 实体完整性 参照完整性
DEFAULT(默认值)、CHECK(检 查)约束
PRIMARY KEY(主键)约束、 UNIQUE(唯一)约束
FOREIGN KEY(外键)约束
14 14
9.2 约束
主键约束
在数据表中经常有一列或多列的组合,其值能唯一地标 识表中的每一行。这样的一列或多列称为表的主键 。
17 17
9.2 约束
CONSTRAINT:可选关键字,表示PRIMARY KEY、 NOT NULL、UNIQUE、FOREIGN KEY或CHECK约束定 义的开始 。 constraint_name:约束的名称。约束名称必须在表所属 的架构中唯一。 PRIMARY KEY:是通过唯一索引对给定的一列或多列 强制实体完整性的约束。每个表只能创建一个 PRIMARY KEY 约束 。 CLUSTERED | NONCLUSTERED:指示为PRIMARY KEY约束创建聚集索引还是非聚集索引。PRIMARY KEY 约束默认为CLUSTERED。
16 16
9.2 约束
(1) 创建表时声明主键约束 如果表的主键由单列组成,则该主键约束可以定义为该 列的列约束。如果主键由两个以上的列组成,则该主键约束 必须定义为表约束 。 ①定义列级主键约束 语法格式如下: [ CONSTRAINT constraint_name ] PRIMARY KEY [ CLUSTERED | NONCLUSTERED ]
24 24
9.2 约束
FOREIGN KEY REFERENCES:为列中的数据提供参 照完整性的约束。FOREIGN KEY 约束要求列中的每个值 在所引参照的表中对应的被引用列中都存在。 [ schema_name . ] referenced_table_name:是FOREIGN KEY约束参照的表的名称,以及该表所属架构的名称。 ( ref_column [ ,... n ] ):是FOREIGN KEY约束所引用的 表中的一列或多列 。