数据完整性约束
- 表的数据有一定的取值范围和联系,多表之间的数据有时也有一定的参照关系。
- 在创建表和修改表时,可通过定义约束条件来保证数据的完整性和一致性。
- 约束条件是一些规则,在对数据进行插入、删除和修改时要对这些规则进行验证,从而起到约束作用。
完整性约束分类
域完整性约束(非空not null,检查check)
实体完整性约束(唯一unique,主键primary key)
参照完整性约束(外键foreign key)
约束类型 | 说明 |
---|---|
主键约束(Primary Key) | 要求主键列数据唯一,并且不允许为空。主键可以包含表的一列或多列,如果包含表的多列,则需要在表级定义。 |
唯一约束(Unique) | 要求该列唯一,允许为空,但只能出现一个空值 |
检查约束(Check) | 某列取值范围限制、格式限制等,如年龄的约束 |
非空约束(not null) | 某类内容不能为空 |
外键约束(Foreign Key) | 用于两表间建立关系,需要指定引用主表的那列。外键通常用来约束两个表之间的数据关系,定义外键的那张表称为子表,另一张表称为主表。 在表的创建过程中,应该先创建主表,后创建子表。 |
三种完整性约束的区别
- 域完整性约束:字段约束
- 实体完整性约束:行和行之间的约束
- 引用完整性约束:表和表之间的约束
创建约束的时机
- 在建表的同时创建
- 建表后创建
- 约束从作用上分类,可以分成两大类:
- 表级约束:可以约束表中的任意一列或多列。可以定义出了Not Null以外的任何约束。
- 列级约束:只能约束其所在的某一列。可以定义任何约束。
命名规则推荐采用:约束类型_约束字段
非空约束 | NN_表名列名 |
---|---|
唯一约束 | UK_表名_列名 |
主键约束 | PK_表名 |
外键约束 | FK_表名_列名 |
检查约束 | CK_表名_列名 |
数据库表的约束
主键约束
- 主键约束是数据库中最重要的一种约束。在关系中,主键值不可为空,也不允许出现重复,即关系要满足实体完整性规则。
- 主键从功能上看相当于非空且唯一
- 一个表中只允许一个主键
- 主键是表中能够唯一确定一个行数据的字段
- 主键字段可以是单字段或者是多字段的组合
1 | Oracle为主键创建对应的唯一性索引 |
唯一性约束
唯一性约束条件确保所在的字段或者字段组合不出现重复值
唯一性约束条件的字段允许出现空值,且可以多个空值
1 | Oracle将为唯一性约束条件创建对应的唯一性索引 |
非空约束
- 确保字段值不允许为空
- 只能在字段级定义
1 | CREATE TABLE employees( |
check约束
- Check约束用于对一个属性的值加以限制
- 在check中定义检查的条件表达式,数据需要符合设置的条件
1 | create table emp3 |
- 在这种约束下,插入记录或修改记录时,系统要测试新的记录的值是否满足条件
外键约束
- 外键是表中的一个列,其值必须在另一表的主键或者唯一键中列出
- 作为主键的表称为“主表”,作为外键的关系称为“依赖表”
- 外键参照的是主表的主键或者唯一键
- 对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个记录(即删除一个主键值,那么对依赖的影响可采取下列3种做法:
- RESTRICT方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。
- CASCADE方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除
- SET NULL方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值
- FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
- [ON DELETE [CASCADE|SET NULL]] 如省略on短语,缺省为第一中处理方式。
添加约束和删除约束
- 添加约束
1 | ALTER TABLE 表名 |
- 删除约束
1 | ALTER TABLE 表名 |
- 可增加或删除约束,但不能直接修改
索引index
- 索引类型默认采用B树数据结构,数据全部集中在叶子节点
- 索引的创建有两种情况
- 自动: 当在表上定义一个PRIMARY KEY 或者UNIQUE 约束条件时,Oracle数据库自动创建一个对应的唯一索引.
- 手动: 用户可以创建索引以加速查询
相关语法
- 在一列或者多列上创建索引.
1 | CREATE INDEX index ON table (column[, column]...); |
下面的索引将会提高对EMP表基于 ENAME 字段的查询速度.
1 | CREATE INDEX emp_last_name_idx |
- 通过DROP INDEX 命令删掉一个索引.
1 | DROP INDEX index; |
- 删掉 UPPER_LAST_NAME_IDX 索引.
1 | DROP INDEX upper_last_name_idx; |
序列sequence
序列是oracle专有的对象,它用来产生一个自动递增的数列
创建序列的语法:
1 | create sequence seq-name |
实例:
1 | create sequence seq_empcopy_id start with 1 increment by 1; |
使用序列
1 | select seq_empcopy_id.nextval from dual |
查看序列状态
1 | select seq_empcopy_id.currval from dual |
删除序列
1 | drop sequence seq_empcopy_id; |
视图view
- 定义:
- 视图是从若干基本表和(或)其他视图构造出来的表。
- 在创建一个视图时,只是存放的视图的定义,也即是动态检索数据的查询语句,而并不存放视图对应的数据
- 在用户使用视图时才去求相对应的数据。所以视图被称作“虚表”
- 作用:
- 可以限制对数据的访问,可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
- 可以使复杂的查询变的简单。在编写查询后,可以方便地重用它而不必知道他的基本查询细节。
- 提供了对相同数据的不同显示
创建视图
1 | CREATE [OR REPLACE] VIEW view |
查询视图
1 | select * from viewname |
不需要再写完全的Select查询语句,
删除视图
1 | Drop view viewname; |
删掉视图不会导致数据丢失,因为视图是基于数据库表的一个查询
总结
- 视图是一个虚拟表,对应一条SELECT语句,可将它的输出看作一个表
- 视图不存储数据
- 改变基本表的数据,也会反应到基于该表的视图上
- 视图可以基于基本表的若干行,若干列
- 视图可以基于一个表、多个表,甚至是基于其他的视图
- 使用视图可以提高数据访问的安全性,只显示指定的行列数据
- 使用视图可以降低查询的难度,定制数据显示
- 可以对视图进行CRUD操作,实际上是对基本表的CRUD操作
- 如果视图对应多个表,一般不允许添加操作,可以通过触发器解决
- 使用with read only定义只读视图
事务
一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位。
事务是为了保证数据库的完整性
在oracle中,没有事务开始的语句。一个Transaction起始于一条DML(Insert、Update和Delete )语句,结束于以下的几种情况:
用户显式执行Commit语句提交操作或Rollback语句回退。
当执行DDL(Create、Alter、Drop)语句事务自动提交。
用户正常断开连接时,Transaction自动提交。
系统崩溃或断电时事务自动回退。
Commit表示事务成功地结束,此时告诉系统,数据库要进入一个新的正确状态,该事务对数据库的所有更新都以交付实施。每个Commit语句都可以看成是一个事务成功的结束,同时也是另一个事务的开始。
Rollback表示事务不成功的结束,此时告诉系统,已发生错误,数据库可能处在不正确的状态,该事务对数据库的更新必须被撤销,数据库应恢复该事务到初始状态。每个Rollback语句同时也是另一个事务的开始。
一旦执行了commit语句,将目前对数据库的操作提交给数据库(实际写入DB),以后就不能用rollback进行撤销。
执行一个 DDL ,DCL语句或从 SQL*Plus正常退出,都会自动执行commit命令。
提交或回滚前数据的状态
- 以前的数据可恢复
- 当前的用户可以看到DML操作的结果
- 其他用户不能看到DML操作的结果
- 被操作的数据被锁住,其他用户不能修改这些数据
提交后数据的状态
数据的修改被永久写在数据库中.
- 数据以前的状态永久性丢失.
所有的用户都能看到操作后的结果.
- 记录锁被释放,其他用户可操作这些记录.
回滚后数据的状态
- 语句将放弃所有的数据修改
- 修改的数据被回退.
- 恢复数据以前的状态.
- 行级锁被释放.