INSERT文の使用と2種類の挿入方法
教科書訂正
VALUE句の・・・ → VALUES句の
■格納する行の列の値は、定数のほかに演算子を・・・。
INSERT INTO emp
(empno,comm)
VALUES (’1234’,20*1.05+1000); ←empnoは数値型なので「’」不要。基本構文
INSERT INTO <表名>
[ ( <列名1> [,<列名2>,<列名3>,・・・] ) ]
VALUES (<値1> [,<値2>,<値3>,・・・] )
例@ 全列のデータを挿入するINSERT INTO DEPT
VALUES (50,’FINANCE’,’LOS ANGELS’);・部門表(DEPT)にDEPTNOが50,DNAMEがFINANCE、LOCがLOS ANGELSの行を追加する。
・VALUES句の( )内の項目の順番は、表の列の定義と個数やデータ型が完全に一致していなければならない。
例A 特定の列のデータだけを挿入するINSERT INTO DEPT
(DEPTNO,DNAME)
VALUES (50,’FINANCE’);・部門表(DEPT)にDEPTNOが50,DNAMEがFINANCEの行を追加する。
・表名の後の列名は表の列名と一致していなければならない。
・VALUE句の( )内の項目の順番は、表名の( )内に指定した列と順番、個数、データ型が完全に一致していなければならない。
・指定しない列にはNULLが入る。
★注意
・INSERT文1つで挿入されるのは1行のみ。(複数挿入するときは置換変数を利用して1つのSQL文を複数回実行する。)
・格納する値は演算も可能。
・INSERT文を実行しただけでは挿入は確定されない。
・COMMIT文で挿入を確定する。(元に戻せなくなる。)
・COMMIT前であれば、ROLLBACK文で挿入前の状態に復元することができる。
(詳しくは5−4参照)
既存データの変更にはUPDATE文を用いる。
基本構文
UPDATE <表名>
SET <列名1> = <値1> [ , <列名2> = <値2>,・・・]
[ WHERE <条件式> ]
例@
UPDATE EMP
SET SAL = SAL * 1.05;・EMP表のSAL列の全行のデータを現在の値の1.05倍する。
・WHERE句を書かない場合はすべての行を更新してしまうので注意。
例A
UPDATE EMP
SET SAL = SAL * 1.05
WHERE JOB = ’SALESMAN’;・EMP表のJOBがSALESMANのデータを現在の値の1.05倍する。
・WHERE句を書いた場合は特定の行を更新する。★注意
・UPDATE文を実行しただけでは更新は確定されない。
・COMMIT文で更新を確定する。(元に戻せなくなる。)
・COMMIT前であれば、ROLLBACK文で更新前の状態に復元することができる。
(詳しくは5−4参照)
既存データの削除にはDELETE文を用いる。
基本構文
DELETE FROM <表名>
[ WHERE <条件式> ]
例@
DELETE FROM EMP;
・EMP表の全データを削除する。
・WHERE句を書かない場合は表内の全データを削除してしまうので注意。
例A
DELETE FROM EMP
WHERE EMPNO = 1234;・EMP表のEMPNOが1234のデータを削除する。
・WHERE句を書いた場合は特定の行を削除する。★注意
・DELETE文を実行しただけでは完全に削除されない。
・COMMIT文で削除を確定する。(完全に削除され、元に戻せなくなる。)
・COMMIT前であれば、ROLLBACK文で復元することができる。
(詳しくは5−4参照)
トランザクション処理で実行した挿入、変更、削除など一連の処理を確定することをコミットという。
コミットはコマンド入力によって手動で行う場合とORACLEによって自動的に行われる場合の2種類がある。@コマンド入力による手動コミット
COMMITコマンドを実行し、確定する。明示的なコミットという。
基本構文COMMIT
ADDL文実行後に行われる自動コミット
DDL文を実行すると、自動的に確定する。暗黙のコミットという。
※DDL文とは
Data Definition Language : データ定義文
表全体に変更が加わるような操作を行うコマンド。以下のコマンドがDDL。
CREATE
ALTER
DROP
ANALIZE
GRANT
REVOKE
コミットが行われるタイミング
@COMMITコマンドの入力
ADDL文が発行されたとき
Bデータベースからセッションを切断したとき(SQL*Plusを終了したときなど)※自らセッションを切断したとき(正常終了時)はコミットが行われるが、セッションが異常終了したときはロールバックが行われるので注意しよう。
トランザクションの単位
@コミットしてから次にコミットするまでの間
Aログイン(データベースに接続)してからコミットするまでの間
Bログイン(データベースに接続)してからデータベースから切断するまでの間※Bのことをセッションといいます。
読み取り一貫性
挿入、変更、削除を行っても、変更した値を参照できるのは変更を行った本人のみで、すぐに他人がそのデータを参照することはできません。他人は変更前の旧データのみが参照できます。他人が更新済みデータを参照できるようになるのは変更者がコミットした後です。これを読み取り一貫性といいます。
以下に読み取り一貫性の例を挙げます。
渡邉さんは給与データの変更を担当しています。
清水くんは給与明細の印刷を担当しています。★読み取り一貫性が保たれている場合
時間 渡邉さん SCOTTのSAL 清水くん 9:30 7655 10:00 SCOTTのSALを
7655→8000に変更7655 10:05 7655 SCOTTの
SAL検索 765510:10 変更取消(ROLLBACK)
SCOTTのSALが
8000→7655に戻る7655 読み取り一貫性が保たれていれば、
渡邉さんが10:00に変更をしてもコミットしていないのでSCOTTのSALは7655のままです。
10:05に清水くんはSCOTTのSALを読み取り、給与明細にSALを7655と印刷します。
渡邉さんは10:10に間違いに気づき、変更を取り消しました。
★読み取り一貫性がない場合
時間 渡邉さん SCOTTのSAL 清水くん 9:30 7655 10:00 SCOTTのSALを
7655→8000に変更8000 10:05 8000 SCOTTの
SAL検索 800010:10 変更取消(ROLLBACK)
SCOTTのSALが
8000→7655に戻る7655 読み取り一貫性がない場合、
渡邉さんが10:00に変更をすると、即時反映されSCOTTのSALは8000になります。
10:05に清水くんはSCOTTのSALを読みとり(ダーティ・リード)、給与明細に8000と印刷します。
渡邉さんは10:10に間違いに気づき、変更を取り消しました。
SCOTTの給与明細には8000と印刷されてしまっています。
SCOTTさんは、支払われた金額(7655ドル)と給与明細の金額(8000ドル)が違っているとマジギレしてしまいました。
トランザクション処理で実行した挿入、変更、削除など一連の処理を取り消すことをロールバックという。
基本構文
ROLLBACK
※ROLLBACKを実行すると変更が無効となり、前回のコミット直後の状態に戻ります。(ログイン後コミットしていないときはログイン直後の状態に戻ります。)
※ROLLBACKでDML文の取り消しはできるが、DDL文の取り消しはできない(暗黙のコミット)。
DML文(ROLLBACK可)
INSERT,DELETE,UPDATE
(SELECTもDMLであるが、データを検索するのみで変更を加えないのでROLLBACKとは関係ない)
DDL文(ROLLBACK不可・暗黙のコミット)
CREATE,ALTER,DROP,ANALIZE,GRANT,REVOKE
★例1
@〜Iのコマンドを順番に実行した場合@ COMMIT
A INSERT INTO EMP ・・・・
B INSERT INTO EMP ・・・・
C DELETE FROM EMP ・・・・
D UPDATE EMP SET ・・・・
E ROLLBACK
F UPDATE EMP SET ・・・・
G INSERT INTO EMP ・・・・
H DELETE FROM EMP ・・・・
I COMMITEのROLLBACKを実行するとA〜Dの処理は取り消される。
IのCOMMITでF〜Hの処理が確定する。★例2
@〜Iのコマンドを順番に実行した場合@ COMMIT
A INSERT INTO EMP ・・・・
B INSERT INTO EMP ・・・・
C ALTER TABLE EMP ・・・・
D UPDATE EMP SET ・・・・
E ROLLBACK
F UPDATE EMP SET ・・・・
G INSERT INTO EMP ・・・・
H DELETE FROM EMP ・・・・
I COMMITEのROLLBACKを実行するとDの処理のみ取り消される。CのALTER文はDDL文であり、暗黙のコミットが行われ、この時点でA〜Cは確定する。
IのCOMMITでF〜Hの処理が確定する。
トランザクション処理で大量に挿入、変更、削除などを実行する場合、ROLLBACKでどの位置まで戻るかを指定することができます。
基本構文
SAVEPOINT <SAVEPOINT名称>
ROLLBACK TO <SAVEPOINT名称>
※ROLLBACK TOを実行すると指定したSAVEPOINTに処理が戻ります。
★例1
@〜Iのコマンドを順番に実行した場合@ COMMIT
A INSERT INTO EMP ・・・・
B UPDATE EMP SET ・・・・
C SAVEPOINT a
D UPDATE EMP SET ・・・・
E INSERT INTO EMP ・・・・
F SAVEPOINT b
G DELETE FROM EMP ・・・・
H ROLLBACK TO b
I COMMITHのROLLBACK TO bを実行するとGの処理は取り消される。
IのCOMMITでABDEの処理が確定する。★例2
@〜Iのコマンドを順番に実行した場合@ COMMIT
A INSERT INTO EMP ・・・・
B UPDATE EMP SET ・・・・
C SAVEPOINT a
D UPDATE EMP SET ・・・・
E INSERT INTO EMP ・・・・
F SAVEPOINT b
G DELETE FROM EMP ・・・・
H INSERT INTO EMP ・・・・
I ROLLBACK
IのROLLBACKでSAVEPOINTを指定していないため、処理はすべて取り消される。
※ROLLBACK TOによってSAVEPOINTに処理が戻っても、SAVEPOINT以前の処理がCOMITTされるわけではないので注意。最終的にCOMMITしなければ処理は確定しない。
★例3
@〜Iのコマンドを順番に実行した場合@ COMMIT
A INSERT INTO EMP ・・・・
B UPDATE EMP SET ・・・・
C SAVEPOINT a
D UPDATE EMP SET ・・・・
E INSERT INTO EMP ・・・・
F SAVEPOINT b
G DELETE FROM EMP ・・・・
H ROLLBACK TO b
I COMMITCでSAVEPOINTを作成してもABはコミットされない。