本节内容
1.数据库约束
2.默认值
3.空值
4.数据库事务控制
一、数据库约束
约束是用来强制业务规则、惯例和策略并确保数据的准确性和完整性的规则
约束可以解决这样的问题,它能够在数据违反了某些规则时禁止将其加入到表中
主要作用是防止在数据库中输入错误的数据
Oracle数据库约束有五大类:
主键约束:PRIMARY KEY主键约束在表中定义一个主键来唯一确定表中每一行数据的标识符.(唯一,且非空)
唯一约束:UNIQUE 确保这一列的数据值都是唯一的,但是可以为null
检查性约束:在向表中添加数据时可以对数据先进行一定的条件判断,满足条件才允许添加
外键约束:在一对多的关系中,保持数据的完整性,在一张表中是主键,在另一张表中是外键。FOREIGN KEY
非空约束:确保指定的列不能有null值。not null
我们使用约束来将我们的表创建的更加完善,让我们的表在存储数据的时候能达到冗余最小。
约束的使用分为2中:
列级约束:在创建列的时候添加约束。
表级约束:在列全部创建完毕后添加约束。
我们的5大约束:主键、外键、唯一、检查都可以使用在表级以及列级
非空约束只能使用在列级不能使用在表级。
创建约束的语法:
创建列级约束的语法: create table 表名( 列名 数据类型 尺寸 默认值 [CONSTRAINT 约束名称] 约束类型, 列名 数据类型 尺寸 默认值 [CONSTRAINT 约束名称] 约束类型,.... ) 创建表级约束的语法: CREATE TABLE 表名( 列名 类型, 列名 类型,...., 列名,[CONSTRAINT 约束名] 约束类型 (列名, ...) )
也可以在表创建完成后来添加约束:
添加列时添加约束 ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型(列名); 添加not null 约束 ALTER TABLE 表名 MODIFY 列名 数据类型 [CONSTRAINT 约束名] 约束类型);
使用 alter table 语句只能添加约束、删除约束,不能修改约束
删除约束:
ALTER TABLE 表名 DROP CONSTRAINT 约束名
约束使用范例:
主键约束:
给我们的学生表学生编号创建为主键约束:
--创建有主键约束的表 student 学号是主键 create table student ( s_id number(3) primary key--这是列级使用,使用系统默认的约束名 ) --这是表级使用 create table student ( s_id number(3), constraint "_pk" primary key(s_id)--这是表级约束,使用自己定义的约束名 )
唯一约束:
--学生表:地址列使用唯一约束 create table student ( s_id number(3) primary key,--这是列级使用,使用系统默认的约束名 addr varchar2(50) unique ) --这是表级使用 create table student ( s_id number(3), addr varchar2(50), constraint "_pks" primary key(s_id),--这是表级约束,使用自己定义的约束名 constraint "_unique" unique(addr) )
检查性约束
--学生表:年龄使用检查性约束 年龄在 18 到22岁之间 create table student ( s_id number(3) primary key,--这是列级使用,使用系统默认的约束名 addr varchar2(50) unique, age number(2) check( age>18 and age<22) ) --这是表级使用 create table student ( s_id number(3), addr varchar2(50), age number(2), constraint "_pks" primary key(s_id),--这是表级约束,使用自己定义的约束名 constraint "_unique" unique(addr), constraint "_agecheck"check(age>18 and age<22) )
非空约束:
--学生表:学生的姓名 s_name 不能为空 create table student ( s_id number(3) primary key,--这是列级使用,使用系统默认的约束名 addr varchar2(50) unique, age number(2) check( age>18 and age<22), s_name varchar2(20) not null--not null只能使用在列级不能使用在表级 )
外键约束:
--成绩表: score 学号: 课程 成绩 --学号是外键 create table score ( s_id number(3) references student(s_id) --列级使用外键 ) --表级使用外键 create table score ( s_id number(3), foreign key(s_id) references student(s_id) )
外键约束的特征:
(1)子表外键字段的值必须在主表被参照字段值得范围内,或者为NULL;
(2)外键参照的必须是主表的主键或唯一键(??);
(3)主表主键/唯一键被子表参照时,主表相应记录不允许被删除。
使用外键约束的相关原则:
(1)创建数据表时,先创建主表,后创建子表;删除表的顺序相反;
(2)添加数据时,先向主表中添加/插入记录,后向子表添加记录;删除数据操作顺序相反;
(3)修改数据(UPDATE)的情况要复杂一些,通常使用触发器实现。
约束无效化与激活
可能有时候我们需要快速大批量的将数据存储到数据库表中,那么这个时候约束就成了我们的绊脚石:这个时候我们可以将约束无效化
ALTER TABLE 表名 DISABLE CONSTRAINT 约束名 CASCADE;
将约束无效化 ALTER TABLE score DISABLE CONSTRAINT SYS_C0011279 CASCADE;
激活约束:
ALTER TABLE 表名 ENABLE CONSTRAINT 约束名;
ALTER TABLE score ENABLE CONSTRAINT SYS_C0011279;
二、默认值
在我们创建表时可以给列设置默认值,,这样在你给表添加数据时如果我不给这个列添加数据,那么就会自动添加默认值。
create table student ( s_id number(3), sex char(3) default '男' )
在添加数据时:如果全部添加
insert into student values(101,default)--使用default占位 insert into student(s_id) values(102) --选择性添加就不需要占位
默认值:字符串, 表达式, 或SQL 函数都是合法的
其它列的列名是非法的
默认值必须满足列的数据类型定义
三、空值:
数据库中的空值:空值是无效的,未指定的,未知的或不可预知的值。
空值不是空格或者0。
空值等同于”“(空字符串)
在数据库中任何列的默认下都是空值 null
在数据库中任何包含空值的计算数学表达式的值都是空
四、数据库事务:
什么是事务?
在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行。
如:转账操作
事务的特性:
- 原子性(Atomicity):一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做。
- 一致性(Consistency):事务开始时,数据库中的数据是一致的,事务结束时,数据库的数据也应该是一致的。
- 隔离性(Isolation):是指数据库允许多个并发事务同时对其中的数据进行读写和修改的能力,隔离性可以防止事务的并发执行时,由于他们的操作命令交叉执行而导致的数据不一致状态。
- 持久性 (Durability) : 是指当事务结束后,它对数据库中的影响是永久的,即便系统遇到故障的情况下,数据也不会丢失。
一组SQL语句操作要成为事务,数据库管理系统必须保证这组操作的原子性(Atomicity)、一致性(consistency)、隔离性(Isolation)和持久性(Durability),这就是ACID特性
Oracle中支持多个事务并发执行,事务的并发执行可能会对数据产生异常:
脏读:
当一个事务修改数据时,另一事务读取了该数据,但是第一个事务由于某种原因取消对数据修改,使数据返回了原状态,这是第二个事务读取的数据与数据库中数据不一致,这就叫脏读。
不可重复读
是指一个事务读取数据库中的数据后,另一个事务则更新了数据,当第一个事务再次读取其中的数据时,就会发现数据已经发生了改变,这就是不可重复读取。不可重复读取所导致的结果就是一个事务前后两次读取的数据不相同
幻读
如果一个事务基于某个条件读取数据后,另一个事务则更新了同一个表中的数据,这时第一个事务再次读取数据时,根据搜索的条件返回了不同的行,这就是幻读
可以通过事务的隔离性来消除数据异常。
事务的控制命令:
提交事务:
我们关于数据库的操作,都没有直接到数据库,而是在内存中,我们需要通过提交,把关于数据库的改变,保存到数据库,让所有的用户对数据共享,如果没有提交,那么数据不能共享。
在执行使用COMMIT
语句可以提交事务,当执行了COMMIT语句后,会确认事务的变化,结束事务,删除保存点,释放锁。当使用COMMIT语句结束事务之后,其他会话将可以查看到事务变化后的新数据。
回滚事务:
保存点(savepoint):是事务中的一点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。当执行ROLLBACK时,通过指定保存点可以回退到指定的点。
提交事务: commit; 回滚全部事务: rollback; 保存节点: Savepoint a; 回滚部分事务: Rollback To a; 删除节点: Release Savepoint a;