第8章 数据完整性
Transcript of 第8章 数据完整性
![Page 1: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/1.jpg)
第 8 章 数据完整性
![Page 2: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/2.jpg)
本章内容
8.1 数据完整性概述8.2 使用规则实施数据完整性8.3 使用默认值实施数据完整性8.4 使用约束实施数据完整性
![Page 3: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/3.jpg)
8.1 数据完整性概述 完整性定义
数据完整性有 4 种类型:实体完整性 (Entity Integrity) 、域完整性 (Domain Integrity) 、参照完整性 (Referential Integrity) 、用户定义的完整性 (User-defined Integrity) 。
完整性保障在 SQL Server 中可以通过各种规则 (Rule) 、默认
(Default) 、约束 (Constraint) 和触发器 (Trigger)等数据库对象来保证数据的完整性。
![Page 4: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/4.jpg)
8.2 使用规则实施数据完整性
8.2.1 创建规则8.2.2 查看和修改规则8.2.3 规则的绑定与松绑8.2.4 删除规则
![Page 5: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/5.jpg)
8.2.1 创建规则 规则 (Rule) 是数据库中对存储在表中列的
值或用户定义数据类型的规定和限制,它指定字段可接受哪些数据值。
规则是单独存储的独立的数据库对象。 规则和约束可以同时使用,表的列可以有
一个规则及多个约束。规则与检查约束在功能上相似,但在使用上有所区别。
8.2 使用规则实施数据完整性
![Page 6: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/6.jpg)
8.2.1 创建规则检查约束是在 CREATE TABLE 或 ALTER TAB
LE 语句中定义的,嵌入了被定义的表结构,即删除表的时候检查约束也就随之被删除。
而规则需要用 CREATE RULE 语句定义后才能使用,是独立于表之外的数据库对象,删除表并不能删除规则,需要用 DROP RULE 语句才能删除。
相比之下,使用在 CREATE TABLE 或 ALTER TABLE 语句中定义的检查约束是更标准的限制列值的方法,但检查约束不能直接作用于用户定义数据类型。
8.2 使用规则实施数据完整性
![Page 7: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/7.jpg)
例、创建一个数据表 employee1 ,包含 4 个字段:员工编号、员工姓名、职务、工资,要求将员工编号设置为主键,并创建一个规则 ru_salary ,将该规则绑定到表 employee的“工资”字段上,限定该字段的值为 2000~10000.
Create table employee1(empno char(4) not null PRIMARY KEY, ename char(8), eposition char(20), salary int)GOCreate Rule ru_salary AS @sa>=2000 and @sa<=10000GOExec Sp_bindrule 'ru_salary','employee1.salary'
![Page 8: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/8.jpg)
1 .用企业管理器创建规则8.2.1 创建规则
在企业管理器中选择数据库对象“规则”,单击右键从快捷菜单中选择“新建规则”选项,即会弹出如图所示的“规则属性”对话框。
输入规则名称和表达式之后,单击“确定”按钮,即完成规则的创建。
![Page 9: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/9.jpg)
2 .用 CREATE RULE 语句创建规则
8.2.1 创建规则
CREATE RULE 语句用于在当前数据库中创建规则,其语法格式如下:
CREATE RULE rule_name AS condition_expression
![Page 10: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/10.jpg)
8.2.1 创建规则
CREATE RULE hire_date_rule
AS @hire_date>='1980-01-01' and @hire_date<=getdate()
例 8-2 创建性别规则 sex_rule 。CREATE RULE sex_rule
AS @sex in (' 男 ',' 女 ')
例 8-1 创建雇佣日期规则 hire_date_rule 。
![Page 11: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/11.jpg)
8.2.1 创建规则
CREATE RULE grade_rule
AS @value between 1 and 100
例 8-4 创建字符规则 my_character_rule 。Create rule my_character_rule
As @value like '[a-z]%[0-9]'
例 8-3 创建评分规则 grade_rule 。
![Page 12: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/12.jpg)
1 .用企业管理器查看和修改规则 在企业管理器的数据库对象中选择“规则”对象,
即可从右边的任务板中看到规则的大部分信息,包括规则的名称、所有者、创建时间等。
8.2.2 查看和修改规则8.2 使用规则实施数据完整性
![Page 13: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/13.jpg)
8.2.2 查看和修改规则
使用 sp_helptext 系统存储过程可以查看规则的文本信息。
例 8-5 查看规则 hire_date_rule 的文本信息EXECUTE sp_helptext hire_date_rule
运行结果如图所示
2 .用系统存储过程 sp_helptext 查看规则
![Page 14: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/14.jpg)
8.2.3 规则的绑定与松绑 需要将规则与数据库表或用户定义对象联
系起来,才能发生作用。联系的方法称为绑定,所谓绑定就是指定规则作用于哪个表的哪一列或哪个用户定义数据类型。
表的一列或一个用户定义数据类型只能与一个规则相绑定,而一个规则可以绑定多个对象。
解除规则与对象的绑定称为松绑。
8.2 使用规则实施数据完整性
![Page 15: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/15.jpg)
8.2.3 规则的绑定与松绑
在企业管理器中,展开数据库( Sales )文件夹,鼠标单击“规则”选项,在右窗格中选择要进行绑定的规则( hire_date ),单击鼠标右键,从快捷菜单中选择“属性” 菜单项,打开“规则属性”对话框,如图8-4 所示。
图中的“绑定 UDT(U)” 按钮用于绑定规则到用户定义的数据类型,“绑定列(B)” 按钮用于绑定规则到表的列。
1 .用企业管理器管理规则的绑定和松绑
![Page 16: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/16.jpg)
8.2.3 规则的绑定与松绑
在图 8-4 中单击“绑定 UDT(U)” 按 钮 , 则 出 现“将绑定规则到用户定义的数据类型”对话框,如图 8-5 所示;
![Page 17: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/17.jpg)
8.2.3 规则的绑定与松绑
单击“绑定列 (B)” 按钮,则出现如图 8-6 所示的“将绑定规则到列”对话框。
在“将规则绑定列”对话框的左边“未绑定的列”列表框中选择一列“添加”到右边“绑定列”列表框中,就实现规则绑定了。
同样,去掉“将规则绑定到用户定义的数据类型”对话框的列表框的“绑定”列下的标识或删除“将规则绑定列”对 话 框 的 右 边 “ 绑 定列”列表框的列,就实现了规则的松绑操作。
![Page 18: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/18.jpg)
8.2.3 规则的绑定与松绑
2 .用系统存储过程 sp_bindrule 绑定规则
系统存储过程 sp_bindrule 可以绑定一个规则到表的一个列或一个用户定义数据类型上。其语法格式如下:sp_bindrule [@rulename =] 'rule',
[@objname =] 'object_name'
[ , [ @futureonly=] 'futureonly' ]
![Page 19: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/19.jpg)
8.2.3 规则的绑定与松绑
EXEC sp_bindrule hire_date_rule, 'employee.hire_date'
运行结果为:已将规则绑定到表的列上。
例 8-6 将例 8-1 创建的规则 hire_date_rule绑定到 employee 表的 hire_date 列上。
![Page 20: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/20.jpg)
8.2.3 规则的绑定与松绑
EXEC sp_addtype pat_char,'varchar(10)','NOT NULL'GOEXEC sp_bindrule my_character_rule, pat_char, 'futureo
nly‘
运行结果如下:(所影响的行数为 1 行)类型已添加。已将规则绑定到数据类型。
例 8-7 定义用户定义数据类型 pat_char ,将例 8-4 创建的规则 my_character_rule绑定到 pat_char 上。
![Page 21: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/21.jpg)
8.2.3 规则的绑定与松绑
EXEC sp_bindrule sex_rule, 'employees.emp_sex' 运行结果如下:
已将规则绑定到表的列上。
例 8-8 绑定例 8-2 创建的规则 sex_rule 到 employees 表的字段 emp_sex 上。
![Page 22: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/22.jpg)
8.2.3 规则的绑定与松绑
系统存储过程 sp_unbindrule 可解除规则与列或用户定义数据类型的绑定,其语法格式如下:sp_unbindrule [@objname =] 'object_name'
[ , [ @futureonly = ] 'futureonly' ]
3 .用系统存储过程 sp_unbindrule 解除规则的绑定
![Page 23: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/23.jpg)
8.2.3 规则的绑定与松绑
例 8-9 解除例 8-6 和例 8-7 绑定在 employees表的 hire_date 列和用户定义数据类型 pat_char 上的规则。
EXEC sp_unbindrule 'employees.hire_date'
运行结果如下:(所影响的行数为 1 行)已从表的列上解除了规则的绑定。EXEC sp_unbindrule pat_char,'futureonly'
运行结果如下:(所影响的行数为 1 行)已从数据类型上解除了规则的绑定。
![Page 24: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/24.jpg)
8.2.4 删除规则
使用 DROP RULE 语句删除当前数据库中的一个或多个规则。其语法格式如下:DROP RULE {rule_name} [,...n]
注意:在删除一个规则前,必须先将与其绑定的对象解除绑定。
例 8-10 删除例 8-1 和 8-2 中创建的规则。DROP RULE sex_rule,hire_date_rule
8.2 使用规则实施数据完整性
![Page 25: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/25.jpg)
8.3.1 创建默认值8.3.2 查看默认值8.3.3 默认值的绑定与松绑8.3.4 删除默认值
8.3 使用默认值实施数据完整性
![Page 26: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/26.jpg)
8.3 使用默认值实施数据完整性
8.3.1 创建默认值 默认值 (Default) 可以帮助处理不包括全部数据表
字段的 Insert 操作。当在插入记录时没有指定字段的值时,将用默认值代替相应字段的值。
默认值对象可以用于多个列或用户定义数据类型。表的一列或一个用户定义数据类型只能与一个默认值相绑定。
默认值的创建、查看、绑定、松绑和删除等操作可在企业管理器中进行,也可利用 Transact-SQL语句进行。
![Page 27: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/27.jpg)
8.3.1 创建默认值
8.3.1 创建默认值
1 .用企业管理器创建默认值
在企业管理器中选择数据库对象的“默认值”对象,单击右键,从快捷菜单中选择“新建默认值”选项,打开“默认属性”对话框,如图 8-7 所示。输入默认值名称和值表达式之后,单击“确定”按钮,即完成默认值的创建。
![Page 28: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/28.jpg)
8.3.1 创建默认值
2 .用 CREATE DEFAULT 语句创建默认值
CREATE DEFAULT 语句用于在当前数据库中创建默认值对象,其语法格式如下:CREATE DEFAULT default_name
AS constant_expression
![Page 29: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/29.jpg)
例、将上例中“工资”字段的默认值设为“ 2000”, 名称为 de_salary
Create default de_salary AS 2000
GO
Exec sp_bindefault ‘de_salary’, ‘employee1.salary’
![Page 30: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/30.jpg)
8.3.1 创建默认值
例 8-11 创建生日默认值 birthday_defa 。 CREATE DEFAULT birthday_defa
AS '1978-1-1'
例 8-12 创建当前日期默认值 today_defa 。 CREATE DEFAULT today_defa
AS getdate()
![Page 31: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/31.jpg)
1 .用企业管理器查看默认值 在企业管理器中选择数据库对象的“默认值”对
象,即可从右边的任务板中看到默认值的大部分信息,如图 8-8 所示。
8.3.2 查看默认值8.3 使用默认值实施数据完整性
![Page 32: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/32.jpg)
8.3.2 查看默认值
选择要查看的默认值,单击右键,从快捷菜单中选择“属性”选项,就会出现图 8-9所示的“默认属性”对话框,可以从中编辑默认值的值表达式。
![Page 33: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/33.jpg)
2 .用系统存储过程 sp_helptext 查看默认值
使用 sp_helptext 系统存储过程可以查看默认值的细节。
例 8-13 查看默认值 today_defa 。EXEC sp_helptext today_defa
运行结果如图 8-10 所示。
8.3.2 查看默认值
![Page 34: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/34.jpg)
8.3.3 默认值的绑定与松绑1 .用企业管理器管理默认值的绑
定和松绑 在企业管理器中,选择要进行
绑定设置的默认值,单击右键,从快捷菜单中选择“属性”选项,打开“默认属性”对话框,参见图 8-9 。
图 8-9 中的“绑定 UDT(U)” 按钮用于将默认值绑定到用户定义数据类型,“绑定列 (B)” 按钮用于将默认值绑定到表的列。单击“绑定 UDT(U)” 按钮,则出现如图 8-11 所示的“将绑定默认值到用户定义的数据类型”对话框
8.3 使用默认值实施数据完整性
![Page 35: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/35.jpg)
8.3.3 默认值的绑定与松绑
单击“绑定列 (B)” 按钮,则出现如图 8-12 所示的“将绑定默认值到表的列”对话框。管理默认值与用户定义数据类型以及表的列之间的绑定和松绑与规则相同。
![Page 36: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/36.jpg)
8.3.3 默认值的绑定与松绑
2 .用 sp_bindefault 绑定默认值
系统存储过程 sp_bindefault 可以绑定一个默认值到表的一个列或一个用户定义数据类型上。其语法格式如下:sp_bindefault [@defname =] 'default',
[@objname =] 'object_name'
[ , [ @futureonly=] 'futureonly' ]
![Page 37: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/37.jpg)
8.3.3 默认值的绑定与松绑
例 8-14 绑定默认值 today_defa 到 employee表的 hire_date 列上。
EXEC sp_bindefault today_defa, 'employee.hire_date'
运行结果如下:已将默认值绑定到列。
![Page 38: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/38.jpg)
8.3.3 默认值的绑定与松绑
3 .用 sp_unbindefault 解除默认值的绑定
系统存储过程 sp_unbindefault 可以解除默认值与表的列或用户定义数据类型的绑定,其语法格式如下:
sp_unbindefault [@objname =] 'object_name'
[ , [ @futureonly=] 'futureonly' ]
![Page 39: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/39.jpg)
8.3.3 默认值的绑定与松绑
例 8-15 解除默认值 today_defa 与表 employee 的 hire_date 列的绑定。
EXEC sp_unbindefault 'employee.hire_date' 运行结果如下:
(所影响的行数为 1 行)已从表的列上解除了默认值的绑定。
![Page 40: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/40.jpg)
8.3 使用默认值实施数据完整性
8.3.4 删除默认值 可以在企业管理器中选择默认值,单击右
键,从快捷菜单中选择“删除”选项删除默认值,也可以使用 DROP DEFAULT 语句删除当前数据库中的一个或多个默认值。其语法格式如下:DROP DEFAULT {default_name} [,...n]
例 8-16 删除生日默认值 birthday_defa 。DROP DEFAULT birthday_defa
![Page 41: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/41.jpg)
8.4.1 主键约束8.4.2 外键约束8.4.3 惟一性约束8.4.4 检查约束8.4.5 默认约束
8.4 使用约束实施数据完整性
![Page 42: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/42.jpg)
8.4 使用约束实施数据完整性
8.4.1 主键约束 约束 (Constraint) 是 SQL Server提供的自动保持
数据库完整性的一种机制,它定义了可输入表或表的单个列中的数据的限制条件。使用约束优先于使用触发器、规则和默认值。
约束独立于表结构,作为数据库定义部分在 CREATE TABLE 语句中声明,可以在不改变表结构的基础上,通过 ALTER TABLE 语句添加或删除。当表被删除时,表所带的所有约束定义也随之被删除。
![Page 43: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/43.jpg)
8.4.1 主键约束
主键 表的一列或几列的组合的值在表中惟一地指定一行
记录,这样的一列或多列称为表的主键( Primary Key , PK ),通过它可强制表的实体完整性。
主键不允许为空值,且不同两行的键值不能相同。表中可以有不止一个键惟一标识行,每个键都称为侯选键,只可以选一个侯选键作为表的主键,其他侯选键称作备用键。
如果一个表的主键由单列组成,则该主键约束可以定义为该列的列约束。如果主键由两个以上的列组成,则该主键约束必须定义为表约束。
![Page 44: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/44.jpg)
8.4.1 主键约束
定义列级主键约束的语法格式如下:[CONSTRAINT constraint_name]
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
定义表级主键约束的语法格式如下:[CONSTRAINT constraint_name]
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
{ (column_name [, … n ] )}
![Page 45: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/45.jpg)
例、创建项目表 project ,包含项目名称、项目编号、开始日期、项目负责人编号,设立项目编号为主键。
Create table project( 项目编号 char(8) not null primary key, 项目名称 varchar(30), 开始日期 datetime, 负责人编号 char(4))
![Page 46: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/46.jpg)
例、将上例中的项目编号和项目名称设立为主键
Create table project( 项目编号 char(8) not null, 项目名称 varchar(30), 项目负责人 char(8) , Constraint pk_pno_pname primary key (项目编号,项目名称)
)
![Page 47: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/47.jpg)
8.4.1 主键约束
例 8-17 在 employee 数据库中创建 customer 表,并声明主键约束。
CREATE TABLE employee.dbo.customer
( customer_id bigint NOT NULL
IDENTITY(1,1) PRIMARY KEY,
customer_name varchar(50) NOT NULL,
linkman_name char(8),
address varchar(50),
telephone char(12)
)
IDENTITY(1,1) :初值为 1 ,增量为 1
![Page 48: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/48.jpg)
8.4.1 主键约束
例 8-18 创建一个产品信息表 goods ,将产品编号 goods_id 列声明为主键。
CREATE TABLE goods( goods_id char(6) NOT NULL, goods_name varchar(50) NOT NULL, classification_id char(6) NOT NULL, unit_price money NOT NULL, stock_quantity float NOT NULL, order_quantity float NULL CONSTRAINT pk_p_id PRIMARY KEY (goods_
id))
![Page 49: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/49.jpg)
8.4 使用约束实施数据完整性
8.4.2 外键约束
外键约束定义了表与表之间的关系。当一个表中的一列或多列的组合与其他表中的主关键字定义相同时,就可以将这一列或多列定义为外关键字,可以使数据更新同步,也可拒绝违背参照完整性的数据插入到数据表中。通过外键约束可以强制参照完整性。
![Page 50: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/50.jpg)
8.4.2 外键约束
例如, Sales 数据库中的 employee 、 sell_order 、 goods这 3 个表之间存在以下逻辑联系:在 sell_order表上应建立两个外键约束 FK_sell_order_employee 和FK_sell_order_goods, sell_order 表 employee_id 列和goods_id 列的值必须分别来自 employee 表的 employee_id 列及 goods 表的 goods_id 列。
企业管理器中建立约束:数据库—关系图
![Page 51: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/51.jpg)
8.4.2 外键约束
级联操作
SQL Server提供了两种级联操作以保证数据完整性:(1) 级联删除:确定当主键表中某行被删除时,外
键表中所有相关行将被删除。(2) 级联修改:确定当主键表中某行的键值被修改
时,外键表中所有相关行的该外键值也将被自动修改为新值。
![Page 52: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/52.jpg)
8.4.2 外键约束
外键约束与主键约束相同,也分为表约束与列约束。 定义表级外键约束的语法格式如下:
[CONSTRAINT constraint_name]FOREIGN KEY (column_name [, … n ])REFERENCES ref_table [(ref_column [, … n] )][ ON DELETE { CASCADE | NO ACTION } ][ ON UPDATE { CASCADE | NO ACTION } ] ][ NOT FOR REPLICATION ]注: CASCADE级连操作, NO ACTION :默认值,报错并回滚操作
定义列级外键约束的语法格式如下:[CONSTRAINT constraint_name][FOREIGN KEY]REFERENCES ref_table[ NOT FOR REPLICATION ]注: NOT FOR REPLICATION 插入从其他表复制的数据时,约束无效
![Page 53: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/53.jpg)
例、有员工信息表 employee 和项目表 project如下所示:
Create table employee( 员工编号 char(4) not null primary key, 员工姓名 varchar(8), 职务 char(20), 工资 int)Create table project( 项目编号 char(8) not null primary key, 项目名称 varchar(30), 开始日期 datetime, 负责人编号 char(4))
![Page 54: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/54.jpg)
例、为项目表 project 的字段“负责人编号”建立外键约束,参照员工信息表 employee 的字段“员工编号”
ALTER TABLE project
ADD CONSTRAINT fk_pro_emp FOREIGN KEY(负责人编号 ) REFERENCES employee(员工编号 ) ON DELET
E CASCADE ON UPDATE CASCADE
![Page 55: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/55.jpg)
8.4.2 外键约束
例 8-20 创建一个订货表 sell_order1 ,与例8-18 创建的产品表 goods1 相关联。
CREATE TABLE sell_order1( order_id1 char(6) NOT NULL, goods_id char(6) NOT NULL, employee_id char(4) NOT NULL, customer_id char(4) NOT NULL, transporter_id char(4) NOT NULL, order_num float NULL, discount float NULL, order_date datetime NOT NULL, send_date datetime NULL, arrival_date datetime NULL, cost money NULL, CONSTRAINT pk_order_id PRIMARY KEY (order_id1), FOREIGN KEY (goods_id) REFERENCES goods1(goods_id))
![Page 56: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/56.jpg)
8.4.2 外键约束
CREATE TABLE sell_order2( order_id1 char(6) PRIMARY KEY, goods_id char(6) NOT NULL CONSTRAINT FK_goods_id FOREIGN KEY (goods_id) REFERENCES Goods1(goods_id) ON DELETE NO ACTION ON UPDATE CASCADE, employee_id char(4) NOT NULL CONSTRAINT FK_employee_id FOREIGN KEY (employee_id) REFERENCES employee(employee_id) ON UPDATE CASCADE, customer_id char(4) NOT NULL, transporter_id char(4) NOT NULL, order_num float, discount float, order_date datetime NOT NULL, send_date datetime, arrival_date datetime, cost money, CONSTRAINT FK_customer_id FOREIGN KEY (customer_id) REFERENCES customer(customer_id))
例 8-21 创建表 sell_order2 ,并为 goods_id 、 employee_id 、 custom_id 三列定义外键约束。
![Page 57: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/57.jpg)
8.4 使用约束实施数据完整性
8.4.3 惟一性约束惟一性 (Unique) 约束指定一个或多个列的组合的值具有惟一性,以确保在非主关键字段或字段组合中不输入重复的值,为表中的一列或者多列提供实体完整性。
惟一性约束和主键约束的区别:在一个表中只能定义一个主键约束,但可以定义
多个惟一性约束允许空值的字段上不能定义主键约束,但可以定
义惟一性约束
![Page 58: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/58.jpg)
8.4.3 惟一性约束
定义列级惟一性约束的语法格式如下:[CONSTRAINT constraint_name]
UNIQUE [CLUSTERED | NONCLUSTERED]惟一性约束应用于多列时的定义格式:
[CONSTRAINT constraint_name]
UNIQUE [CLUSTERED | NONCLUSTERED]
(column_name [, … n ])
![Page 59: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/59.jpg)
8.4.3 惟一性约束
例、修改 employees 表,使字段 emp_cardid具有惟一性
ALTER TABLE employees
ADD CONSTRAINT u_empcadid UNIQUE
(emp_cardid)
![Page 60: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/60.jpg)
例、创建项目表 project ,包含项目名称、项目编号、项目负责人,设立项目编号为主键,主键约束名为 pk_pno ,为项目名称和项目负责人的字段组合设立惟一性约束,约束名为 u_pna_pm 。
Create table project
(
项目编号 char(8) constraint pk_pno primary key,
项目名称 varchar(30),
项目负责人 char(8),
constraint u_pna_pm UNIQUE( 项目名称 , 项目负责人 )
)
![Page 61: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/61.jpg)
8.4 使用约束实施数据完整性
8.4.4 检查约束 检查 (Check) 约束对输入列或整个表中的值
设置检查条件,以限制输入值,保证数据库的数据完整性。
当对具有检查约束列进行插入或修改时, SQL Server 将用该检查约束的逻辑表达式对新值进行检查,只有满足条件 (逻辑表达式返回 TRUE) 的值才能填入该列,否则报错。可以为每列指定多个 CHECK 约束。
![Page 62: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/62.jpg)
检查约束与外键约束的区别
外键约束是从另一个表中获得有效数值的列表
检查约束基于逻辑表达式进行判断
![Page 63: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/63.jpg)
8.4.4 检查约束
定义检查约束的语法格式:
[CONSTRAINT constraint_name]
CHECK [NOT FOR REPLICATION]
(logical_expression)
![Page 64: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/64.jpg)
例、创建一个数据表 employee2 ,包含 3 个字段:员工编号、员工姓名、工资,要求将 “员工编号”设置为主键,为字段“员工姓名”设置惟一性约束,限定“工资”字段的取值范围在 2000~5000 之间,检查约束名为 ck_sa 。
Create table employee2(empno char(4) not null PRIMARY KEY, ename char(8) UNIQUE, salary int NOT NULL Constraint ck_sa Check(salary>=2000 and salary<=5000))
![Page 65: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/65.jpg)
8.4.4 检查约束例 8-24 更改表 employee2 以添加未验证检查约束。
ALTER TABLE employee2
WITH NOCHECK
ADD CONSTRAINT CK_Age
CHECK (DATEDIFF(year, Birth_Date, Hire_Date)>18)
注: WITH NOCHECK 现有记录不验证约束
![Page 66: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/66.jpg)
8.4.4 检查约束
例 8-25 创建一个订货表 orders ,保证各订单的订货量必须不小于 10 。
CREATE TABLE orders( order_id char(8), p_id char(8), p_name char(10) , quantity smallint CONSTRAINT chk_quantity CHECK (quantity>=10), CONSTRAINT pk_orders_id PRIMARY KEY (order_id)
)
![Page 67: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/67.jpg)
8.4.4 检查约束
CREATE TABLE transporters( transporter_id char(4) NOT NULL, transport_name varchar(50), linkman_name char(8), address varchar(50), telephone char(12) NOT NULL CHECK(telephone LIKE '0[1-9][0-9][0-9]-[1-9][0-9][0-9][0-9][0-9][0-9][0-9]' OR telephone LIKE '0[1-9][0-9]-[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'))
例 8-26 创建 transporters 表并定义检查约束
![Page 68: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/68.jpg)
8.4 使用约束实施数据完整性
8.4.5 默认约束 默认 (Default) 约束通过定义列的默认值或使
用数据库的默认值对象绑定表的列,以确保在没有为某列指定数据时,来指定列的值。
默认值可以是常量,也可以是表达式,还可以为 NULL 值。
![Page 69: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/69.jpg)
8.4.5 默认约束
定义默认约束的语法格式
[CONSTRAINT constraint_name]
DEFAULT constant_expression [FOR column_name]
![Page 70: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/70.jpg)
8.4.5 默认约束
例 8-27 在 employee 数据库中,为员工表 employees 的sex 列添加默认约束,默认值是“男”。 ALTER TABLE employees
ADD CONSTRAINT sex_default DEFAULT ' 男 ' FOR sex
例 8-28 更改表 employee 为 hire_date 列定义默认约束。 ALTER TABLE employees
ADD CONSTRAINT hire_date_df DEFAULT (getdate())
FOR hire_date
![Page 71: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/71.jpg)
8.4.5 默认约束
例 8-29 添加具有默认值的可为空的列
ALTER TABLE employees
ADD hire_date datetime
DEFAULT (getdate()) WITH VALUES
注: WITH VALUES 现有每行都用默认值,否则该值为空 NULL
![Page 72: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/72.jpg)
8.4.5 默认约束
例 8-30 使用默认约束。-- 创建表 purchase_orderCREATE TABLE purchase_order( order_id2 char(6)NOT NULL, goods_id char(6) NOT NULL, employee_id char(4) NOT NULL, supplier_id char(5) NOT NULL, transporter_id char(4), order_num float NOT NULL, discount float DEFAULT (0),order_date datetime NOT NULL DEFAULT (GetDate()), send_date datetime, arrival_date datetime)-- 使用 DEFAULT VALUES 选项为 purchase_order 表装载数据。INSERT INTO purchase_order DEFAULT VALUES
![Page 73: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/73.jpg)
8.4.5 默认约束
例 8-31 为表 purchase_orders 定义多个约束CREATE TABLE purchase_orders( order_id2 char(6) NOT NULL, goods_id char(6) NOT NULL, employee_id char(4) NOT NULL, supplier_id char(5) NOT NULL, transporter_id char(4), order_num float NOT NULL, discount float CHECK (discount>=0 AND discount<=50) DEFAULT (0),order_date datetime NOT NULL DEFAULT (GetDate()), send_date datetime, arrival_date datetime, CONSTRAINT CK_Send_date CHECK (send_date > order_date), CHECK (arrival_date > send_date))
![Page 74: 第8章 数据完整性](https://reader033.fdocument.pub/reader033/viewer/2022061605/556a2ae9d8b42a2f3f8b50d9/html5/thumbnails/74.jpg)
本章小结(1) 数据完整性有 4 种类型:实体完整性、域完整性、参照完整性和用
户定义的完整性。在 SQL Server 2000 中可以通过各种约束、默认、规则和触发器等数据库对象来保证数据的完整性。
(2) 规则实施数据的完整性:规则就是数据库中对存储在表的列或用户定义数据类型中的值的规定和限制。可以通过企业管理器和 Transact-SQL 语句来创建、删除、查看规则以及规则的绑定与松绑。
(3) 默认值实施数据完整性:默认值是用户输入记录时没有指定具体数据的列中自动插入的数据。默认值对象可以用于多个列或用户定义数据类型,它的管理与应用同规则有许多相似之处。表的一列或一个用户定义数据类型也只能与一个默认值相绑定。在 SQL Server 中使用企业管理器和 Transact-SQL 语句实现默认值的创建、查看、删除以及默认值的绑定与松绑。
(4) 使用约束实施数据完整性:约束是 SQL Server提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件。在 SQL Server 中有 6 种约束:非空值约束、主键约束、外键约束、惟一性约束、检查约束和默认约束。