目标:
1、掌握DML语言的基本特征
2、学会在一张表中插入记录
3、学会在一张表中更改记录
4、学会在一张表中删除记录
5、控制事务
Agenda
一、DML语言的基本特征
在一张表中增加数据
--- INSERT语句
在一张表中改变数据
--- UPDATE语句
在一张表中删除数据
--- DELETE语句
--- TRUNCATE语句
二、学会使用COMMIT、ROLLBACK和SAVEPOINT控制事务
三、读一致性
四、学会在SELECT语句中使用FOR UPDATE子句对指定的数据进行加锁
一、DML语言的基本特征
当在一张表中增加、更改、删除数据时就会涉及DML语句,事务是一个DML语句,形成一个逻辑单元。
增加数据
INSERT每次插入一条记录
如果是数值则用逗号隔开,如果是字符串型和日期型则还需要加单引号
示例:
先复制一个表,在复制的表中进行操作,从而不影响原来表
增加一条新的数据
如果只插入两列,则其余为NULL值
示例1:隐式
示例2:显式
如果列的类型是NOT NULL时插入NULL就会报错
示例:
插入特殊值
示例1:插入一条员工信息数据,且入职日期是今天
示例2:
示例3:使用替换变量
批量插入:复制其他表中数据
1、不使用VALUES子句
2、相应列数目、类型要相同
示例:
先把“copy_departments”表中数据清空
UPDATE语法(谨慎)
可以同时更新多条记录,通过WHERE子句指定更新的范围示例1:将雇员号为198的部门号改为20
示例2:将雇员113的工作岗位和薪资同雇员205相同
DELETE语法
示例1:
示例2:
TRUNCATE语法
清空表数据,是数据定义语言(DDL)
TRUNCATE删除的数据不容易回滚回来,而DELETE删除的数据可以回滚回来
示例1:使用DELETE清空表数据
示例2:使用TRUNCATE清空表数据
显然,执行回滚后,数据依然回不来
二、学会使用COMMIT、ROLLBACK和SAVEPOINT控制事务
1、DML语句构成对数据一致性修改
2、DDL语句
3、DCL语句
数据库事务有开始也有结束,当第一条DML SQL语句执行的时候,这个事务就开始了,当执行COMMIT或者ROLLBACK时就会结束;
或者到执行DDL或者DCL语句的时候会结束;或者退出SQL*Plus或者SQL Developer时会结束,这时候没有提交的数据会提交;或者数据
宕了时候,但是宕了后,当再次登进数据库的时候,会把上次没有提交的数据回滚掉。
COMMIT和ROLLBACK
1、保持数据一致性
2、数据会永久性修改
3、把有逻辑的有联系的操作做成一个组,便于理解
示例:
SAVEPOINT
作用相当于一个标签
隐含事务处理
1、当一个DDL语句执行的时候,DML语句就会自动提交
2、当一个DCL语句执行的时候,DML语句就会自动提交
3、正常退出SQL*Plus或者SQL Developer时候,即便没有执行COMMIT和ROLLBACK语句的时候,DML语句也会自动提交
4、异常退出SQL*Plus或者SQL Developer时候,或者系统宕了,当再次进入系统,数据库会自动回滚数据
示例:
先创建一个临时表,并增加一个数据
这个时候数据并没有提交
正常退出数据库
这个时候再增加一条数据
然后再开一个界面,查看一下SQL*Plus的进程
模拟异常退出,杀死SQL*Plus进程
返过来看SQL*Plus窗口
然后重新登陆到“HR”查看一下
显然是没有的
SET AUTO OFF ---> 关闭自动提交
SET AUTO ON ---> 开启自动提交
开启自动提交,并插入一条数据
然后重复异常关闭数据库,查看表t中有无数据
三、读一致性
数据在COMMIT或者ROLLBACK之前是怎样的
1、可以使当前的操作无效掉(即数据以前的状态可以恢复)
2、本用户可以执行SELECT语句查看之前的DML操作
3、其他用户查看不到本用户执行的DML操作
示例:
用户1执行一条DML操作
打开另一窗口使用 用户2 查看
显然看不到 用户1 执行的DML操作
但是当 用户1 提交了之后
继续使用 用户2 查看
即立刻查看到了
数据在COMMIT之后
1、数据改变会立即存入数据库中
2、以前的数据不能回滚回来了
3、所有用户都可以查看修改后的操作了
4、相关行的锁就会释放掉,其他用户就可以操作这些行
5、打的SAVEPOINTS(标签)就会消除掉
数据在ROLLBACK之后
1、数据所有的改变都会被放弃
2、以前的数据会恢复
3、相关的行的锁会释放掉
示例:
用户1 进行操作
用户2 查看
依然可以查看的到
用户1 进行回滚
发现数据都恢复了
语句级回滚
1、语句失败自动回滚
2、每条语句都会有隐含的SAVEPOINT
3、其他改变仍然存在
读一致性
1、保证任何一个用户会看到数据的一致状态
2、一个用户对数据的修改不会对另一个用户修改发生冲突
3、对相同的数据保证了:
--- 读者不会等候写者
--- 写者不会等候读者
--- 写者会等候写者
四、学会在SELECT语句中使用FOR UPDATE子句对指定的数据进行加锁
1、加上FOR UPDATE时,就会把查询的数据锁住
2、当执行COMMIT或者ROLLBACK后锁才会释放
3、当其他用户锁住本用户想要操作的行的时候,那么本用户就会等候释放才可以操作
示例:
用户1 锁住一行
用户2 继续也执行这一行的操作
即发现不能执行下去,需要一直等候
用户1 提交
用户2 继续执行相同操作
用户2 继续执行相同操作
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30197839/viewspace-1976825/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30197839/viewspace-1976825/