12009-7-28 Information College · ChangJun
第六章设计数据完整性
22009-7-28 Information College · ChangJun
回顾
SQL语言的特点及组成
SQL Server的标识符命名规则
SQL Server的数据类型
创建、删除和修改表的基本方法
32009-7-28 Information College · ChangJun
目标
数据完整性基础
使用约束措施
使用规则措施
使用默认值
42009-7-28 Information College · ChangJun
6.1 数据完整性基础
造成无效操作或错误信息的原因:
一、什么是数据完整性
数据完整性( Data Integrity)是指数据的正确性和可靠性。
数据库中存在不符合语义规定的数据。
(垃圾进垃圾出 ---Garbage In Garbage Out)
52009-7-28 Information College · ChangJun
这些加在数据库数据之上的语义约束条件就是数据完整性约束条件。
一、什么是数据完整性
数据库管理系统( DBMS)必须提供一种机制来检查数据库中的数据,看其是否满足语义规定的条件。
DBMS检查数据是否满足完整性条件的机制就称为完整性检查。
62009-7-28 Information College · ChangJun
3、用户定义的完整性( User-defined
Integrity)。
考虑限制向表中输入的值的范围。
二、数据完整性 的类型
1、实体完整性( Entity Integrity)
考虑向表中输入哪些值。要求每个实体都必须拥有一个主键或其他的唯一标识列。
2、参照(引用)完整性( Referential
Integrity)
考虑表间的数据在插入和删除时,数据的一致性。要求建立在主键和外键基础上。
72009-7-28 Information College · ChangJun
三,完整性的作用对象
1.列级约束对数据类型的约束:包括数据类型、长度、
精度等。
对数据格式的约束:如规定学号的前两位表示学生的入学年份,第三位表示系的编号,第四位表示专业编号,第五位代表班的编号等等。
对取值范围或取值集合的约束:如学生的成绩取值范围为 0~ 100。
对空值的约束:列是否允许为空。
完整性的作用对象可以是,列、元组和表
82009-7-28 Information College · ChangJun
三,完整性的作用对象
3.关系约束关系约束是指若干元组之间、关系之间的联系的约束。比如学号的取值不能重复也不能取空值,学生选课表中的学号的取值受学生表中的学号取值的约束等 。
2.元组约束元组的约束是元组中各个字段之间的联系的约束,如:开始日期小于结束日期,职工的最低工资不能低于规定的最低保障金等。
92009-7-28 Information College · ChangJun
四、实现 完整性的措施
SQL Server 提供了一些措施(方法、途径)来帮助用户维护数据完整性,其中最主要的是:
1、约束
2、规则
3、默认值
4、触发器
102009-7-28 Information College · ChangJun
6.2 使用约束措施
PRIMARY KEY(主键)约束
FOREIGN KEY (外键)约束
UNIQUE(惟一)约束
CHECK(核查)约束
NULLable 约束约束定义关于列中允许值的规则,是强制完整性的标准机制。使用约束优先于使用触发器、
规则和默认值。
SQL Server 2000 支持五类约束:
112009-7-28 Information College · ChangJun
系统存储过程 sp_helpconstraint 获得指定表格上所有约束的信息。
6.2 使用约束措施
约束还可分为:
1、列级约束行定义的一部分,只能够应用在一列上。
2、表级约束独立于列的定义,能够应用在一个表的多列上
设置各种约束措施可用企业管理器或者
Transact-SQL语句完成。
122009-7-28 Information College · ChangJun
一,PRIMARY KEY 约束
从候选键中选择主键的原则:
PRIMARY KEY 约束列或列集,这些列或列集的值唯一标识表中的行。
每个表只能有一个 PRIMARY KEY 约束 。
用于 PRIMARY KEY约束的列 或列集的 取值不能有重复 。
不能在主键内的任何列中输入 NULL 值。
在数据库中 NULL 是特殊值,代表不同于空白和 0 值的未知值。
1、稳定性 2、简单性 3、熟悉性
132009-7-28 Information College · ChangJun
对主键的操作方式有三种:
1、在创建表时定义主键,主键是定义表的一部分。
一,PRIMARY KEY 约束例如,以雇员表和工作表为例,这两张表的结构如下:
雇员 ( 雇员编号 字符型 长度为 7 非空,
雇员名 字符型,长度为 10,
工作编号 字符型,长度为 8,
工资 整型,
电话 字符型,长度为 8 非空)
工作 ( 工作编号 字符型,长度为 8,
最低工资 整型,
最高工资 整型 )
142009-7-28 Information College · ChangJun
列级定义:
例:创建雇员表,并设雇员编号列为 PRIMARY KEY
约束。
CREATE TABLE 雇员
( 雇员编号 char(7) PRIMARY KEY,
雇员名 char(10),
工作编号 char(8),
工资 int,
电话 char(8)
)
一,PRIMARY KEY约束
152009-7-28 Information College · ChangJun
表级定义:
例:创建工作表,并设工作编号列为 PRIMARY KEY
约束。
CREATE TABLE 工作
( 工作编号 char(8),
最低工资 int,
最高工资 int,
CONSTRAINT pk_id PRIMARY KEY(工作编号 )
)
一,PRIMARY KEY 约束
162009-7-28 Information College · ChangJun
例:修改雇员表的 PRIMARY KEY约束为雇员编号和电话的组合。
ALTER TABLE 雇员
ADD CONSTRAINT pk_id PRIMARY KEY( 雇员编号,电话 )
一,PRIMARY KEY约束
2、在一个没有定义主键的表上,加上一个主键。
3、修改或删除表上已经定义的主键。
例:删除工作表的 PRIMARY KEY约束。
ALTER TABLE 工作
DROP CONSTRAINT pk_id
172009-7-28 Information College · ChangJun
二,UNIQUE 约束
列允许有一个空值。
在一个表中可以定义多个 UNIQUE约束。
可以在一个列或多个列上定义 UNIQUE约束
在对应列上自动设置非聚集索引。
例:为雇员表的,电话,列添加 UNIQUE约束

ALTER TABLE 雇员表
ADD CONSTRAINT UK_SID
UNIQUE(电话)
用于限制在一个列中不能有重复的值。这个约束用在事实上具有惟一性的属性列上。
182009-7-28 Information College · ChangJun
三,CHECK 约束
CHECK 约束对可以放入列中的值进行限制,
以强制执行域的完整性。
特点:
1,CHECK 约束指定应用于列中输入的所有值的布尔(取值为 TRUE 或 FALSE)搜索条件,
拒绝所有不取值为 TRUE 的值。
2、可以为每列指定多个 CHECK 约束,按创建顺序检查。
3、可以将一个 CHECK 约束应用于多列。
192009-7-28 Information College · ChangJun
例:新建雇员表,并添加限制工资必须大于等于
200的约束。
CREATE TABLE 雇员
( 雇员编号 char(7) PRIMARY KEY,
雇员名 char(10),
工作编号 char(8),
工资 int CHECK(工资 >=200),
电话 char(8)
)
三,CHECK约束
操作方式有三种:
1、在创建表时,定义 CHECK约束,CHECK约束是定义表的一部分。
202009-7-28 Information College · ChangJun
3、修改或删除表上已经定义的 CHECK约束。
例,删除工作表上的名为 CHK_Job_Salary的
CHECK约束。
ALTER TABLE 工作
DROP CONSTRAINT CHK_Job_Salary
三,CHECK 约束
2、在已经建立的表上,加上 CHECK约束。
例,添加限制工资表的最低工资小于等于最高工资的约束。
ALTER TABLE 工作
ADD CONSTRAINT CHK_Job_Salary
CHECK( 最低工资 <= 最高工资 )
212009-7-28 Information College · ChangJun
四,FOREIGN KEY 约束
特点:
1、标识为外键的列是另一个表标识为主键或唯一键( UNIQUE)的列。通过他们的联系建立两表的联系。
2、外键对输入自身表的数据进行限制。新的数据必须在另一个表的主键上存在或者为 NULL。
3、外键限制对主键所在表的数据进行修改。
4、可设置 SQL Server不对现存的数据进行外键约束的检查。
FOREIGN KEY 约束表之间的关系,维护两个表之间的一致性关系。
222009-7-28 Information College · ChangJun
,操作方式有三种:
1、在创建表时,定义 FOREIGN KEY约束,
FOREIGN KEY约束是定义表的一部分。
例:新建雇员表时,建立一个工作编号列为外键引用。
四,FOREIGN KEY 约束
5、标识为外键约束的列的数据类型及长度必须与所标识为主键约束的列的数据类型及长度一致或可以有 SQL Server自动转换。
232009-7-28 Information College · ChangJun
3、修改或删除表上已经定义的 FOREIGN KEY约束。
四,FOREIGN KEY 约束
CREATE TABLE 雇员
( 雇员编号 char(7) PRIMARY KEY,
雇员名 char(10),
工作编号 char(8) FOREIGN KEY REFERENCES
工作 (工作编号 )
ON DELETE NO ACTION,
工资 int CHECK(工资 >=200),
电话 char(8)
)
2、在已经建立的表上,加上一个 FOREIGN KEY约束。
242009-7-28 Information College · ChangJun
五,DEFAULT 约束
在 CREATE TABLE 中使用 DEFAULT 关键字创建默认定义,将常量表达式指派为列的默认值。
例:
CREATE TABLE test_defaults
( keycol smallint,
process_id smallint DEFAULT @@SPID,
date_ins datetime DEFAULT getdate(),
mathcol smallint DEFAULT 10 * 2,
char1 char(3),
char2 char(3) DEFAULT ‘xyz’)
GO
用于提供列的默认值。
252009-7-28 Information College · ChangJun
六,NULLable 约束
特点:
1,NULL 或 NOT NULL是确定列中是否允许空值的关键字。
2,NULL不是零或空白:它表示没有输入任何内容,或提供了一个显式 NULL值,
通常表示该值未知或不适用。
列的为空性约束决定该列中是否允许以空值 NULL 作为其数据。
262009-7-28 Information College · ChangJun
七,使用 IDENTITY列
特点:
1、该属性与 CREATE TABLE 及 ALTER
TABLE Transact-SQL 语句一起使用。
2、在每个表里最多只能有一个 Identity列,
该列不允许为空和设置默认值。
3、标识为 Identity属性的列通常被设置为整数或其他的数值类型。
在表中创建一个标识列。标识为 Identity
属性的列不必在插入新行时为其赋值,服务器自动设置一个唯一的行序列号。
272009-7-28 Information College · ChangJun
语法
IDENTITY [ ( seed,increment ) ]
参数
seed,装载到表中的第一个行所使用的值。
Increment,增量值,该值被添加到前一个已装载的行的标识值上。
必须同时指定种子和增量,或者二者都不指定。
如果二者都未指定,则取默认值 (1,1)。
可以使用关键字 IDENTITYCOL来引用 Identity
列六,使用 IDENTITY列
282009-7-28 Information College · ChangJun
例:创建一个新表,该表将 IDENTITY 属性用于获得自动增加的标识号。
CREATE TABLE new_employees
( id_num int IDENTITY(1,1),
fname varchar (20),
minit char(1),
lname varchar(30))
INSERT new_employees
(fname,minit,lname)
VALUES ('Karin','F','Josephs')
六,使用 IDENTITY列
292009-7-28 Information College · ChangJun
6.3 使用规则措施
特点:
1、它可以绑定到列或者是用户自定义数据类型上。
2、当用户向绑定的列插入或修改值时,规则会检测修改值的完整性。
3、规则以单独的对象创建,然后绑定到列上,
一个列只能应用一个规则。
CHECK 约束是用来限制列值的首选标准方法。
CHECK 约束比规则更简明,一个列可以应用多个
CHECK 约束。
规则是一组用 Transact-SQL书写的条件语句。用于执行一些与 CHECK 约束相同的功能。
302009-7-28 Information College · ChangJun
一,使用企业管理器管理规则步骤,[创建 ] —— [绑定 ]
312009-7-28 Information College · ChangJun
二,使用 Transact-SQL管理规则
1、创建语法:
CREATE RULE rule_name
AS
Rule_discription
例:
CREATE RULE id_chk AS
@id BETWEEN 0 and 10000
GO
322009-7-28 Information College · ChangJun
2、绑定系统存储过程 sp_bindrule,将规则绑定到列。
sp_bindrule
rule_name,’table_name.column_name’
例:
CREATE TABLE cust_sample
( cust_id int PRIMARY KEY,
cust_name char(50),
cust_address char(50),
cust_credit_limit money)
sp_bindrule id_chk,'cust_sample.cust_id'
二,使用 Transact-SQL管理规则
332009-7-28 Information College · ChangJun
3、解除绑定系统存储过程 sp_unbindrule,为列解除规则绑定。
sp_unbindrule ’table_name.column_name’
例:
EXEC sp_unbindrule id_chk,
‘cust_sample.cust_id’
二,使用 Transact-SQL管理规则
342009-7-28 Information College · ChangJun
4、删除语法:
DROP rule_name
例:
DROP id_chk
GO
二,使用 Transact-SQL管理规则
352009-7-28 Information College · ChangJun
6.4 使用默认值措施
特点:
1、默认值可以是任何取值为常量的对象:内置函数,数学表达式。
2、在 CREATE TABLE 中使用 DEFAULT 关键字创建默认定义是首选的标准方法,也是定义默认值简明的方法。
3、使用 CREATE DEFAULT 语句创建默认对象,
然后使用 sp_bindefault 系统存储过程将它绑定到列上。
默认值指定在插入行时没有指定列的值时,
列所使用的值。
362009-7-28 Information College · ChangJun
一,使用企业管理器管理默认值步骤,[创建 ]—— [绑定 ]
372009-7-28 Information College · ChangJun
二,使用 Transact-SQL管理默认值
1、创建语法:
CREATE DEFAULT default_name
AS
default_discription
例:
CREATE DEFAULT abc_const AS 'abc'
GO
382009-7-28 Information College · ChangJun
2、绑定系统存储过程 sp_bindefault,将默认值绑定到列。
语法:
sp_bindefault
default_name,’table_name.column_name’
例:
sp_bindefault abc_const,
'test_defaults.char1'
二,使用 Transact-SQL 管理默认值
392009-7-28 Information College · ChangJun
例:
假定存在命名为 def_ssn 的默认值和命名为 ssn 的用户定义数据类型,将默认值
def_ssn 绑定到用户定义的数据类型 ssn 中。
例:
USE master
EXEC sp_bindefault 'def_ssn','ssn'
二,使用 Transact-SQL 管理默认值
402009-7-28 Information College · ChangJun
3、解除绑定系统存储过程 sp_unbinddefault,为列解除默认值绑定。
语法:
sp_unbinddefault ’table_name.column_name’
例:
EXEC sp_unbinddefault
‘test_defaults.char1’
二,使用 Transact-SQL管理默认值
412009-7-28 Information College · ChangJun
4、删除语法:
DROP DEFAULT default_name
例:
DROP DEFAULT abc_const
GO
二,使用 Transact-SQL管理默认值
422009-7-28 Information College · ChangJun
示例,
增加约束 后,用企业管理器和 T-SQL
语言重新创建第五章的三张表:
432009-7-28 Information College · ChangJun
列名 说明 数据类型 约束
Sno 学号 字符串,长度为 7 主码
Sname 姓名 字符串,长度为 10 非空
Ssex 性别 字符串,长度为 2 取‘男’或
‘女’
Sage 年龄 整数 取值 15~ 45
Sdept 所在系 字符串,长度为 20 默认为‘计算机系学生表( S)
442009-7-28 Information College · ChangJun
示例课程表( C)
列名 说明 数据类型 约束
Cno 课程号 字符串,长度为
10
主码
Cname 课程名 字符串,长度为
20
非空
Ccredit 学分 整数 取值大于 0
Semster 学期 整数 取值大于 0
Period 学时 整数 取值大于 0
452009-7-28 Information College · ChangJun
示例成绩表( SC)
列名 说明 数据类型 约束
Sno 学号 字符串,长度为
7
主码,引用 Student的外码
Cno 课程名 字符串,长度为
10
主码,引用 Course的外码
Grade 成绩 整数 取值 0~ 100
462009-7-28 Information College · ChangJun
小结设计表时应注意:
1,表所包含的数据的类型 。
2,表的各列及每一列的数据类型 ( 如果必要,
还应注意列宽 ) 。
3,哪些列允许空值 。
4,是否要使用以及何时使用约束,默认设置或规则 。
5,所需索引的类型,哪里需要索引,哪些列是主键,哪些是外键 。
472009-7-28 Information College · ChangJun