数据库 第05章 实现数据完整性
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Copyright@2008
15
DEFAULT 约束(续)
应用 DEFAULT 约束的几种情况
在创建表时使用default属性
4.2.2.1 DEFAULT 约束
CREATE TABLE userInfo ( ... … country varchar(50) not null DEFAULT ‘China’ , …… )
指定列中可接受的数据值
基于其他表中的列的值,指定可接受的 用于更新的数据值 惟一标识每一列,确保用户没有输入重 复的值。同时创建一个索引以增强性能。 不允许空值 确保在非主键列中不输入重复值,并创 建一个索引以增强性能。允许空值 定义一列或多列的值与同表或其他表中 主键的值匹配 基于同表中其他列的值,指定列中可接 受的数据值
表级CHECK约束
Create Table SC constraint chk_gmk check(grade>=0 and grade<=100));
(……..,
Copyright@2008
21
创建CHECK 约束
Create Table Student ( sno char(5) not null,
Copyright@2008
23
CHECK 约束(续)
应用CHECK 约束的注意事项
4.2.2.2 CHECK 约束
一个表可以定义多个CHECK约束,一个列上只 允许创建一个列级CHECK约束。
列级 CHECK 约束只能引用被约束的列,表级 CHECK 约束只能引用同一表中的列。 当列上存在规则和一个或多个 CHECK 约束时, 将验证所有限制。
当给一个表添加约束的时候,SQL Server 将检查 现有数据是否违反约束 建议创建约束的时候指定名称,否则系统将为约 束自动产生一个复杂的名称
名称必须惟一,且符合 SQL Server 标识符的规则
查看约束的信息
系统存储过程:sp_helpconstraint、sp_help 信息模式视图:check_constraints、referential_constraints、
忽略, 不显式地插入值 无默认值 NULL NOT NULL NULL 错误 有默认值 默认值 默认值 插入 NULL 无默认值 NULL 错误 有默认值 NULL 错误 插入 DEFAULT 无默认值 NULL 错误 有默认值 默认值 默认值
Copyright@2008
17
CHECK 约束
4.2.2.2 CHECK 约束
Copyright@2008 18
CHECK 约束(续)
应用CHECK约束的几种情况
在创建表时使用CHECK约束
4.2.2.2 CHECK 约束
CREATE TABLE userInfo ( ... … birthday varchar(50) not null CONSTRAINT ck_birthday CHECK (BirthDate > '01-01-1900' AND BirthDate < getdate()) , )
Copyright@2008
4
约束
4.2 约束
决定使用何种约束 约束的类型
Copyright@2008
5
决定使用何种约束
完整性类型 域 约束类型 DEFAULT
4.2.1 决定使用何种约束 描述 如果在INSERT语句中未显式提供 值,则指定为列提供的值
CHECK
REFERENTIAL (通常使用外键) 实体 PRIMARY KEY
11
PRIMARY KEY 约束
直接在列名后增加关键字 PRIMARY KEY CREATE TABLE Student ( sno char(5) PRIMARY KEY, sname varchar(20) not null,
……
列级主键
);
创建sc表,其主码为(sno,cno)
CREATE TABLE sc
域完整性
域(或列)完整性是指对列指定一组有效的值并决定 是否可为空值
实体完整性
实体(或表)完整性要求表中的所有行都有一个惟一 的标识符,称为主键值
引用完整性
引用完整性确保主键(在被引用表中)和外键(在引 用表中)之间的关系得到保持
Copyright@2008 3
第5章 实现数据完整性
数据完整性的类型 约束 禁用约束 默认值和规则 决定使用何种强制方法 推荐操作
???
(sno char(5) PRIMARY KEY, cno char(1) PRIMARY KEY, grade decimal(4,1)) );
Copyright@2008 12
×
PRIMARY KEY 约束
在CREATE TABLE语句各列定义的最后加: PRIMARY KEY(<属性名表>) CREATE TABLE sc (sno char(5) , cno char(1) , grade decimal(4,1), PRIMARY KEY(sno,cno)); 表级主键
Copyright@2008
9
PRIMARY KEY 约束
4.2.2.3 PRIMARY KEY 约束
PRIMARY KEY 约束在表中定义了一 个惟一标识每一列的主键
语法:[CONSTRAINT 约束名 ] PRIMARY KEY [CLUSTERED | NONCLUSTERED ] { (列[,...n])}
限制输入到指定列的值只能为某些特定值 语法: [CONSTRAINT 约束名] CHECK (逻辑表达式) 两种强制域完整性的方法:CHECK 约束和规则 CHECK 约束定义了一个表达式,若数据修改语句使 得表达式值为 FALSE 的话,将拒绝语句执行 规则的功能和 CHECK 约束基本相同,除了语法不同, 能力稍弱。 规则可定义一次,然后对多个列分别绑定;而 CHECK 约束则需要对每个列定义。但 CHECK 约束 的功能略强一些(例如引用同行中其他列的值和调用 系统函数等)
Copyright@2008
10
PRIMARY KEY 约束
PRIMARY KEY约束利用表中的一列或多
列数据唯一地标识某一行数据
每个表只有一个PRIMARY KEY约束
PRIMARY KEY约束的值必须是唯一的 不允许有空值 SQL Server中最多可定义 16 列作为主键
Copyright@2008
若约束应用于单列,称为列级约束 若约束引用了多列,称为表级约束,即使它并 Fra Baidu bibliotek有引用表中的所有列
Copyright@2008
7
使用约束的注意事项
可直接在表上创建、更改和删除约束,而不必删 除并重建表 应该在应用程序和事务内建立错误检查逻辑,以 测试是否违反了某个约束
SQL Server 里的约束只是“最后防线”
table_constraints 系统表:syscomments、sysreferences、sysconstraints
Copyright@2008 8
约束的类型
4.2.2 约束的类型
DEFAULT 约束 CHECK 约束 PRIMARY KEY 约束 UNIQUE 约束 FOREIGN KEY 约束 级联引用完整性
CREATE TABLE sc1 ( ……….,
约束名
constraint PK_SC PRIMARY KEY(sno,cno));
Copyright@2008 13
删除和添加主键
删除表上已定义的主键
ALTER TABLE SC1 DROP CONSTRAINT PK_SC;
在没有定义主键的表上,加上一个主键
创建CHECK 约束
在创建SC表时定义CHECK约束 Create Table SC ( sno char(5) not null, cno char(1) not null,
列级CHECK约束
grade decimal(4,1) check(grade>=0 and grade<=100),
primary key (sno,cno));
列级CHECK约束
birthdate datetime not null check(birthdate < getdate()),
schooldate datetime not null , primary key (sno), check(birthdate < getdate()), );
表级CHECK约束
ALTER TABLE SC
ADD CONSTRAINT PK_SC primary key (sno,cno);
Copyright@2008
14
DEFAULT 约束
4.2.2.1 DEFAULT 约束
如果一个列的值在 INSERT 语句中没有指定, DEFAULT 约束将自动输入一个值,可以是预先指定 的常量、NULL 或者一个系统函数运行时的值 语法: [CONSTRAINT 约束名] DEFAULT 约束表达式 创建 DEFAULT 约束的两种方法 创建一个默认对象(CREATE DEFAULT),然后 使用存储过程 sp_bindefault 将默认绑定到一个列 CREATE TABLE 或 ALTER TABLE 时使用 DEFAUTL 约束
应用 DEFAULT 约束的注意事项
4.2.2.1 DEFAULT 约束
允许使用常量、函数、系统提供的值:USER、 CURRENT_USER、SESSION_USER、SYSTEM_USER 及 CURRENT_TIMESTAMP 例如: ① DEFAULT USER ② DEFAULE (getdate()) 有可能会和 CHECK 约束冲突 常量值外面可以加或者不加括号,字符或者日期常量必须加上单 引号或双引号
在现有表中创建CHECK约束
USE Northwind ALTER TABLE dbo.Employees ADD CONSTRAINT CK_birthdate CHECK (BirthDate > '01-01-1900' AND BirthDate < getdate())
Copyright@2008 19
第5章 实现数据完整性
数据完整性的类型 约束 禁用约束 默认值和规则 决定使用何种强制方法 推荐操作
Copyright@2008
1
数据完整性的类型
域完整性 (列 )
实体完整性 (行)
参照完整性 (表之间)
Copyright@2008
2
数据完整性的类型
4.1 数据完整性的类型
数据完整性
指的是数据库中存储的数据的一致性和准确性 数据完整性的类型:域完整性、实体完整性、引用完 整性
Copyright@2008
24
UNIQUE 约束
4.2.2..4 UNIQUE 约束
UNIQUE 约束指明列中的任意两行不能有 相同的值
语法:[CONSTRAINT 约束名] UNIQUE [ CLUSTERED | NONCLUSTERED ] { (列[,...n] )}
为已经创建好的表添加default属性
USE Northwind ALTER TABLE dbo.Customers ADD CONSTRAINT DF_contactname DEFAULT 'UNKNOWN' FOR ContactName
Copyright@2008 16
DEFAULT 约束(续)
Copyright@2008 6
UNIQUE 引用 FOREIGN KEY CHECK
创建约束
4.3.2 创建约束
使用 CREATE TABLE 或者 ALTER TABLE
CREATE TABLE 是在创建表时创建约束 ALTER TABLE 是在一个已有的表上创建约束
可以添加约束到已有数据的表上 可添加单列或多列约束
Copyright@2008
20
创建CHECK 约束
Create Table SC ( sno char(5) not null, cno char(1) not null, grade decimal(4,1), primary key (sno,cno), check(grade>=0 and grade<=100));
Copyright@2008
22
添加和删除CHECK 约束
删除SC表中的 CHECK 约束
ALTER TABLE SC DROP CONSTRAINT chk_gmk
向SC表中添加CHECK 约束
ALTER TABLE SC ADD CONSTRAINT chk_gmk check(gmark>=0 and gmark<=100)