【SQL】INSERT,UPDATE,DELETE文の取り消し

このページでは、ORACLEデータベースのSQLで、INSERTやUPDATE、DELETE文を実行した後に、取り消したいときに実行するコマンドを紹介しています。

INSERT,UPDATE,DELETE文の取消

INSERT,UPDATE,DELETE文のDML文は、データを確定する前であれば、キャンセルすることが出来ます。

データの確定のことをコミット、キャンセルのことをロールバックと呼びます。

コミットはcommitコマンドで、ロールバックはrollbackコマンドで実行できます。

ロールバックの使い方は次の通りです。
大文字の「ROLLBACK;」でも小文字の「rollback;」でもどちらでも更新を取り消しすることが出来ます。

SQL> ROLLBACK;

ロールバックが完了しました。

INSERT文の取り消しが出来ない場合の対処方法

ロールバックコマンドが有効なのはトランザクションが確定されていない状態です。

既にデータを確定した場合には、取り消すことが出来ません。

例えば、次のSQLのように、INSERT文を実行した後に、明示的にコミットした場合は取り消しすることが出来ません。

他にも、プログラムで実行して、プログラム内でトランザクションが確定されている場合には取り消しできません。

SQL> insert into tab1(col1,col2,col3) values('00001','0000000001',sysdate);

1行が作成されました。

SQL> commit;

コミットが完了しました。

既にコミットされていてトールバックによる取り消しができないとき、不要なデータを削除するにはDELETE文で削除します。

ただし、レコードを削除する場合には、削除しても良いデータかどうか、運用ルール的に問題ないかどうか、事前によく確認してから削除するようにしましょう。

DELETE文の詳しい使い方については、「【SQL】DELETE文の書き方:サンプル多数あり」で解説していますのでぜひ参考にしてください。

UPDATE文の取り消しが出来ない場合の対処方法

レコードが更新されコミットされているとき、ロールバックにる取り消しは出来ません。

UPDATE文を実行した後に、明示的にコミットした場合やプログラム内でトランザクションが確定されている場合には取り消しできません。

ロールバックによる取り消しが出来ない場合は、元の値になるようにもう一度UPDATEするか、レコードを一旦削除し新たに追加するといった方法があります。

UPDATE文の詳しい使い方については、「【SQL】UPDATE文の書き方:サンプル多数あり」で解説していますのでぜひ参考にしてください。

DELETE文の取り消しが出来ない場合の対処方法

レコードを削除して確定した後は、ロールバックによる取り消しが出来ません。

削除したレコードを復元するには、レコードをINSERTし直す方法があります。バックアップテーブルがあれば、必要なデータだけSELECTしてINSERTすることもできます。

INSERT文の詳しい使い方については、「【SQL】INSERT文の書き方:サンプル多数あり」で解説していますのでぜひ参考にしてください。

まとめ

INSERT,UPDATE,DELETE文を取り消すには、ロールバックコマンドを使います。

ロールバックは大文字の「ROLLBACK;」でも小文字の「rollback;」でもどちらでも更新を取り消しすることが出来ます。

この他にも当サイトではINSERT,UPDATE,DELETE文の使い方を詳しく解説していますのでぜひ参考にしてください。
 ・データの追加:【SQL】INSERT文の書き方:サンプル多数あり
 ・データの更新:【SQL】UPDATE文の書き方:サンプル多数あり
 ・データの削除:【SQL】DELETE文の書き方:サンプル多数あり