当前课程知识点:数据库概论 > 第四章 数据库完整性、视图与安全性 > 4.2 完整性约束 > 完整性约束
同学们好
我是来自云南大学软件学院的包崇明
下面为大家介绍完整性约束
一种是非过程性约束
又称为声明式约束
这类约束通过在
创建表的Create table语句中
提供约束定义子句实现
也可以通过修改表的
Alter table语句中相应子句实现
这种方式相对简单
虽然提供的约束形式有限
但能覆盖大多数设计阶段识别出来的约束
编程简单且效率高
另外一种是过程性约束
需要编程实现
我们称之为触发器
这种方式比较灵活
可以实现更复杂的约束
两种方式各有优点
一般来说
能够在逻辑设计阶段识别出来的约束
尽量采用非过程化约束实现
对于后期需要添加的约束或者复杂约束
才采用触发器实现。
我们先学习非过程性约束
也就是用Create table语句
在创建表的同时定义约束
在不同的商用数据库系统中
Create table语句
包含有不同的复杂子句
但对于约束定义
基本语法上是一致的
一个基本的CREATE TABLE语句的语法
应包含对字段的定义和对约束的定义
如图所示
我们在定义一个字段的时候
可以定义施加于这个字段上面的约束
这类施加于一个字段上面的约束
我们称为列级约束
字段定义结束后
我们还可以定义涉及到
表中多个字段的约束
这种约束我们称为表级约束
列级约束和表级约束是数据库管理系统
提供的两种非过程性约束定义方式
相对列级约束
表级约束更加强大
它可以定义涉及到多个字段的约束
所以我们把列级约束
看着是表级约束的一个特例
除了为一个字段
设定缺省值和定义它的取值不能为空
需要在列上面定义外
其他的列级约束
都可以用表级约束来定义
为了定义的简洁性
一般我们尽量将
只涉及到一个字段的约束定义为列级约束
涉及到多个字段的约束
才采用表级约束定义
定义列级约束时
需要在列名和类型后面加上一个空格
然后定义多个施加于该列上面的约束
最后用一个逗号来结束该列的定义
显然列级约束定义是可选的
一般来说
我们在所有列定义结束后才定义表级约束
这只是一个约定
你也可以在列定义中间穿插定义表级约束
表级约束定义的时候
需要和列定义间用逗号分隔
一张表可定义多个表级约束
每个表级约束间用逗号分隔
我们来看一个表级约束的简化定义
每一个约束我们可定义一个可选的约束名
如果要定义约束名
需要在约束名前
加上关键字CONSTRAINT
定义约束名的好处是
以后如果不需要这个约束了
我们可以用Alter Table语句
来删除这个约束
下面我们看一下几种常见的约束
PRIMARY KEY是主键约束
定义表中一列或者多列组成该表的主键
也意味着组成主键的列
隐含定义了非空和唯一两个约束
主键约束意味着当我们插入一行
如果这一行的主键字段值为空
或者主键字段值在表中其他行中已经存在
插入操作将失败
保证了实体完整性
FOREIGN KEY
即外键约束
用来保证参照完整性
保证我们对一行中外键的取值要么为空
要么是参照表上主键或者候选键的取值
外键定义涉及到参照表
也有多个保证参照完整性的选项
我们将在后面详细介绍
UNIQUE约束
即唯一性约束
可以在表中多列上定义唯一性约束
该约束允许这些列上可取空值
如果一行中这些列上都没有空值
那么该行中
这些列取值的组合在表中必须是唯一的
如果更新或者插入行
导致这些列上组合值不是唯一的
那么更新或者插入操作将失败
CHECK约束
也称为检查约束
定义一个检查约束
需要在关键字check后面的括号里
给出查询表达式
如果是列级check约束
表达式只能引用该列值
如果是表级check约束
查询表达式允许引用表中多列的值
查询表达式求值的结果
是true或者false
更新或者插入行时
将对该行进行查询表达式求值
如果结果为false
那么更新或者插入操作将失败
列级约束中需要注意的是Not Null
即非空约束
在表级约束上没有定义
它要求表中每一行数据在该列上不能取空值
如果更新或者插入行
导致该列上的值为空
那么更新或者插入操作也将失败
除了上述约束
在对字段进行定义的时候
我们可以为该字段指定一个缺省值
这由关键字Default后面
给出该字段的缺省值
当插入一行数据时
如果没有指定该列的值
那么系统将用缺省值填充
如果没有指定缺省值
那么该列的值默认取空值
我们在定义约束的时候
注意定义的约束之间不能相互冲突
比如在一个字段上面定义非空约束后
不能再定义该列的缺省值为空
另外
主键约束在每张表中只能定义一个
下面我们通过一个创建表的例子
来进一步学习如何定义约束
我们用create table语句
创建表customers
并定义了三个列级约束和一个表级约束
在cid字段上
我们定义了一个列级约束not null
约束cid的取值不能为空
在city字段上
我们定义了一个缺省值约束
当插入新行时
如果没有指定city的值
系统将用‘New York’填充
在discnt字段上
我们定义了一个check约束
约束名为discnt_max
当插入或者更新操作时
将检查该行的discnt是否小于15
如果不满足
操作失败
最后我们定义了一个表级约束
在cid字段上定义了主键约束
好了同学们我们下节课再见
-数据库概述
--Video
-导论--数据库概述
-1.1 数据库基础
--Video
-第一章 数据库基础--1.1 数据库基础
-2.1 CAP数据库
--CAP数据库
-第二章 关系运算--2.1 CAP数据库
-2.2 自然关系运算1
-- 自然关系运算1
-第二章 关系运算--2.2 自然关系运算1
-2.3 自然关系运算2
--自然关系运算2
-第二章 关系运算--2.3 自然关系运算2
-3.1 SQL概述
-- SQL概述
-3.1 SQL概述--作业
-3.2 数据定义DDL
--数据定义DDL
-3.2 数据定义DDL--作业
-3.3 SQL数据更新DML
-3.3 SQL数据更新DML--作业
-3.4 复杂SQL查询操作1
-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1
-3.5 复杂SQL查询操作2
-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2
-4.1 数据完整性
-4.1 数据完整性--作业
-4.2 完整性约束
--完整性约束
-4.2 完整性约束--作业
-4.3 外键约束
--外键约束
-4.3 外键约束--作业
-4.4 触发器
--触发器
-4.4 触发器--作业
-4.5 视图
--视图
-4.5 视图--作业
-4.6 安全性
--安全性
-4.6 安全性--作业
-5.1 索引
--Video
-5.2 B+树索引
--Video
-6.1 函数依赖
--Video
-6.2 Armstrong公理
--Video
-6.3 无损分解
--Video
-6.4 范式举例
--Video
-6.5 三种范式
--Video
-6.5 三种范式--作业
-7.1-E-R模型概述
--E-R模型概述
-7.2 E-R模型详解
--Video
-7.3 E-R模型的拓展
--Video
-7.4 E-R模型实例分析
--Video
-8.1 事务的ACID性质介绍
--ACID介绍
-8.1 事务的ACID性质介绍--作业
-8.2 事务经历
--事务经历
-8.2 事务经历--作业
-8.3 可串行化调度和前趋图
-8.3 可串行化调度和前趋图--作业
-8.4 两阶段封锁
--两段锁协议
-8.4 两阶段封锁--作业
-8.5 隔离级别
--隔离级别
-8.5 隔离级别--作业
-8.6 事务恢复
--事务恢复
-8.6 事务恢复--作业
-9.1 数据库使用介绍
--数据库使用介绍
-9.2 Java访问数据库
-9.2 Java访问数据库--作业
-10.1 数据库新技术概述
--Video