& S* z6 ~; J6 {. O$ a; Wcommit; + G* i# }* ~, o9 V2 m% c--执行了3遍 8 d7 c' }2 \. z( d/ einsert into emp_bak1(empno, ename, salary) : s& o1 b# d& ]5 a G2 V7 wvalues(1015,'amy',4000);+ d- R6 s$ c M+ C0 e
--执行了2遍( i1 M4 v+ g# _1 O. |
insert into emp_bak1(empno, ename, salary) 5 c$ x. b, Q+ ?3 evalues(1016,'rory',5000); $ z# |+ H4 {% p/ u& Q* y" w, Q--执行了1遍。/ ?2 {( B$ w- } B" v
insert into emp_bak1(empno, ename, salary)9 n( `2 T( M( B
values(1017,'river',6000); + Z0 f6 B/ d& n--创建表emp_bak2,只存放不重复的记录 & P, E5 j7 \8 c9 wcreate table emp_bak2 9 E% n* @, E* I" _- Sas @. _+ M! ?0 w) I5 A w1 w- L) H
select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr: N1 `/ e3 \+ K: |
from emp_bak1; 9 o& V: x0 D, F7 W j" B/ l--删除表emp_bak1 5 d5 y @0 s7 G2 ?drop table emp_bak1; * B* Y! G1 h$ _# u: ]1 A--把emp_bak2改名为emp_bak1, x: D/ ]- r' K3 Y* l
rename emp_bak2 to emp_bak1; , F; x3 }( h. b' X9 u8 f5 V - }6 b& h" g4 U7 K% C___________________________________________% `$ m; ^( c* ^7 q8 Y: m" [
$ d" g3 F. Q% E- h; X
" H P, G+ Q; B; g; Hdelete emp_bak1; 3 {1 u* }6 Q' H! v8 L9 z . R& `7 V; n6 z! O8 C" Kinsert into emp_bak1(empno, ename, salary)9 h3 d: U) I. M& ?3 p ?/ ~: r
values(1020, 'amy', 4000);! B6 n4 g; \2 s" D* Y [! |
insert into emp_bak1(empno, ename, salary) ; J$ y0 u# U3 s% Y: i9 h6 w1 ?values(1021, 'roy', 5000); . G1 f. N4 a, b: N- s: binsert into emp_bak1(empno, ename, salary)7 D% |1 G% L/ X" ^+ n
values(1022, 'river', 6000);' R7 p# a/ c( u& f
) R& e8 V2 Z" v! ?- M--rowid是Oracle数据库的伪列。$ \3 x: V1 a. j% ^6 t- F
--rowid是Oracle数据库独有的。6 q0 R* Y! r: A: H; Q5 l6 a
delete from emp_bak1! l% p# {5 [- Y: j$ a$ Z& _
where rowid not in ( 0 T- ^" F. R+ R5 a. O select max(rowid) from emp_bak1 " @2 E& C% u B2 [! k group by empno, ename, salary);6 q% ^/ R0 n' r5 A# W! C$ S
4 d+ }+ a# d8 x# S; w二、事务:Transaction7 H4 V F( f. S3 x+ n% \
TCL:Transaction Control Language/ q: P" x! n1 \/ ]0 _* F
commit / rollback / savepoint - b e! q1 ^: N% H$ F事务:一组DML操作的逻辑操作集合$ N/ D/ T4 i4 i# W* k; d. x T1 v/ X$ V
***- Q/ Y e8 O- n. L
1、事务的开始和终止. S: q! C; j/ \; X' e
1)事务开始于上一个事务的终止或者第一条DML语句* a5 i4 s w# b, w
2)事务终止于commit/rollback显式操作。9 ?5 Z- X* }) ^! \7 Z* J
连接关闭:隐式终止+ \ e9 m# a4 g7 x. X1 G
DDL操作,比如create:隐式提交。 0 R6 U3 T+ P* i1 C0 |. F, _4 x0 Z ( F2 j* X( y, U ginsert into ...values...' i8 E& r; [; _- B
update ... 8 [0 t5 P) n; W( Ndelete ...+ I/ U% m4 P: z- }+ c
insert into .... 7 E2 Y; Q, b# d/ l6 ]' s% H* Y% d--rollback;--回退到事务之初,数据的状态和事务 2 [% d2 m' Z( c$ h: \开始之前完全一致。' y s$ M# H. \# j7 P4 }- N% c
commit; --所有的数据改动提交。 6 S, _/ b; O' b# Q$ ^' I( u % e! R0 C7 J9 z/ I2、事务中的数据状态% v* G$ i, a5 s6 D( D- R- w( [( d
create table mytemp_ning(; i! C. h/ m& ?$ s
id number(4)); ( t7 `/ b; `; @+ Linsert into mytemp_ning values(1); 3 Y* Q' Q m- ^6 qinsert into mytemp_ning values(2); - P% D2 d# ]* l$ Y( h7 R! }8 E- q0 }9 y* D
--事务内部的数据改变只有自己的会话能够看到1 A& o. P# G! L- v# X: }
--对事务改动的数据加锁,事务之外不允许操作。$ R2 i! |$ ^1 N+ a
3 l; ^ ~: T* L+ Z
如果提交:commit F) E6 O7 P- [2 o数据的改变被确认。所有的会话都能看到这种改动。2 p6 e. o( ~2 H! X1 M6 d" q; e
数据上的锁被释放。6 H. C1 j7 ^* c" J; L
保存数据的临时空间被释放。 4 D/ H! v2 _% u- w+ a) u' P; ^- }9 O6 @; ^4 P5 B
如果回滚:rollback * [; {& t( y1 N数据的改变被取消。+ O7 x( m0 O7 J' a! R* ]
数据上的锁被释放。 / ~% Q6 W8 H8 i7 ^. B7 o临时空间被释放# q5 s: M0 w2 P" i, ^
create table mytemp_ning(id number(4)); 0 ~ x! G3 v$ i# {--事务起点 9 u V1 e/ s. A9 }) Iinsert into mytemp_ning values(3);# k7 K' z) I: k1 ]) H( v C! N" |( h
savepoint A;* U! h* ]5 U4 H4 Q* c( Y2 [, [1 _
insert into mytemp_ning values(4); 3 g# `! t1 z8 q! |; j$ Tsavepoint B; * ^. d; p" z" A/ v2 Y9 Dinsert into mytemp_ning values(5); 6 y. ~5 l9 k5 P5 W; p" Drollback to A; --回滚到保存点A,A之后的保存点全部被取消/ c" l S: }. s/ e% J) h: ?
select * from mytemp_ning; --3保存,4、5回退 S, M J. `( Z3 e ! r& E8 |) h7 w1 k s5 E; a9 y三、DDL. f! O* m L- x" h
create / drop / alter / truncate- m7 O$ Z% x3 a; f' m" E% `
2 l: e4 i* M( U# B: v7 a' Z
数据库的脚本(script)文件main.sql:8 R6 j0 S6 z& b
------------begin--------------------' q+ }- f) a$ f/ |; P/ A- E
--删除表emp / D. V$ H. Q* g" vdrop table emp;# A# u' ~( g U3 p' E& R
--创建表emp 8 o" [- c6 I- j+ \create table emp(id number(4), ) {3 N. t- h2 Pname char(20));* w5 ?9 h# D/ b) ~1 S8 l1 G
insert into emp values(1, 'amy'); & l6 \ g) s& qcommit;3 m( r _: b1 r