Oracle11G-SQL开发指南-8-修改表的内容。
1. 使用INSERT 语句添加行
a> 省略列的列表
b> 为列指定空值
c> 在列值中使用单引号和双引号
4> 从一个表向另一个复制行
2. 使用UPDATE语句修改行
3. RETURNING子句
4. 使用DELETE语句删除行
5. 数据库的完整性
主键
外键
6. 使用默认值
7. 使用MERGE合并行(用来合并update/insert操作,有则更新,没有就插入)
MEGER INTO table1 t1
USING table2 t2
ON (t1.id = t2.id)
WHEN MATCHED THEN
UPDATE SET t1.name1 = t2.name1, t1.name2 = t2.name2
WHEN NOT MATCHED THEN
INSERT (t1.id,t1.name1,t1.name2) VALUES (t2.id,t2.name1,t2.name2);
8. 数据库事务
a> 事务的提交 COMMIT;
b> 事务的回滚 ROLLBACK;
c> 事务的开始 1:连上数据库执行DML语句;
2:前一个事务结束,又执行DML语句;
d> 事务的结束 1:执行 COMMIT/ROLLBACK ;
2:执行DDL语句,自动提交;
3:断开数据库连接时,正常退出COMMIT,异常退出ROLLBACK
4:执行DML语句失败时ROLLBACK
e> 保存点savepoint 1:设置 savepoint save1
2:回滚到保存点 Rollback to savepoint save1
f> 事务的特性ACID(原子、一致、隔离、持久)
g> 并发事务concurrent transaction,一个以上用户同时对数据库进行交互。
h> 事务锁 默认方式是:读不会阻塞读,写不会阻塞读, 写会阻塞写,不能同时写,
i> 事务的隔离级别
READ UNCOMMITTER:读未提交,允许脏读取,但不允许更新丢失。
如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。
该隔离级别可以通过“排他写锁”实现。
幻像读,不可重复读和脏读都允许。
READ COMMITTER: 读提交,允许不可重复读取,但不允许脏读取。
这可以通过“瞬间共享读锁”和“排他写锁”实现。
读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
允许幻像读和不可重复读,但是不能脏读。
REPEATABLE READ: 可重复读取,禁止不可重复读取和脏读取,但是有时可能出现幻影数据。
这可以通过“共享读锁”和“排他写锁”实现。
读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
允许幻像读,但是不允许不可重复读和脏读。
SERIALIZABLE: 序列化,提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。
如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
幻像读,不可重复读和脏读都不允许。
Oracle支持READ COMMITTER(默认)和SERIALIZABLE这两种,
更新隔离级别: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
幻像读phantom read: T1事务查询 >> T2事务插入数据 >> T1事务在次查询能看到插入数据。
不可重复读nonrepeatabl read: T1事务查询 >> T2事务修改数据 >> T1事务在次查询能看到修改后的数据。
脏读dirty read: T1事务更新数据不提交 >> T2事务读取到T1更新的数据 >> T1回滚事务 >> T2的数据无效,
9. 查询闪回query flashback
在Oracle中如果错误地提交了修改操作,然后想查看修改前的值,这时候可以使用查询闪回
可以根据根据一个时间值或者系统变更号(SCN)进行
a> 授权 grant execute on sys.dbms_flashback to username;
b> 根据时间值返回
EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME() 该过程将数据库状态闪回到一个特定的时间值。
EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(SYSDATE-10/1440 ) 也就是闪存到10分钟之前。
现在执行任何查询就将显示10分钟之前的状态。但是在pl/sql中查询的话 还是现在现在的状态。
所以可以从这里查看之前数据,然后在pl/sql修改回原来的值。
这些命令只能在sqlplus 中使用,在pl/sql中不能使用。
c> 系统变更号查询闪回
根据SCN进行闪回操作比根据时间进行要更精确,因为数据库就是使用SCN来跟踪数据库的变化。
获得当前SCN命令:PRINT CURRENT_SCN
通过下面语句可以闪回到这个SCN的状态
EXECUTE DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:CURRENT_SCN);
d> 禁用闪回操作 EXECUTE DBMS_FLASHBACK.DISABLE();