次に、データを更新してみましょう。データを更新するには、UPDATE文を使用します。UPDATE句の後に表名を、SET句の後に更新する列名と更新後の値を指定します。また、どの行を更新するか(更新対象の行)をWHERE句を使って指定します。条件を指定しなければ、表の全ての行が更新されてしまうため、注意してください。
UPDATE 表名 SET 列名 = 値 WHERE 更新する行を特定する条件;
それでは、DEPT表のデータを更新してみましょう。先ほど部門60のデータをINSERTした際には、部門の場所(LOC)を省略したため、部門60には場所データが登録されていません。そこで、部門60の行を更新して、場所に「北海道」を入力してみましょう。
UPDATE dept SET loc = '北海道' WHERE deptno = 60;
データが更新されると、「1 row(s) updated」(日本語環境では「1行が作成されました」)と表示されます。SELECT文で検索して、正しく更新されたか確認してみましょう。
SELECT * FROM dept;
データを更新する際には、複数の列を一度に更新することもできます。例えば、部門80の部門名を「技術部」に、場所を「福岡」に変更したい場合には、以下のように、UPDATE文のSET句に「列名=値」のペアを、カンマ区切りで指定します。
UPDATE dept SET dname = '技術部', loc = '福岡' WHERE deptno = 80;
SELECT文で更新結果を確認すると、以下のように更新されたことが分かります。
SELECT * FROM dept;
最後に、データを削除してみましょう。データを削除するには、DELETE文を使用します。DELETE句の後に表名を、WHERE句の条件式で削除する行を指定します。UPDATE文と同様に、条件を指定しなければ、表の全ての行が削除されてしまうため、注意してください。
DELETE FROM 表名 WHERE 削除する行を特定する条件;
それでは、DEPT表から、1行データを削除してみましょう。例えば、部門80を削除するには以下のように指定します。
DELETE FROM dept WHERE deptno = 80;
この例では、WHERE句で指定する条件として、deptno列を指定していますが、もちろん他の列を条件にすることもできます。例えば「WHERE loc = '福岡'」のように指定しても、同様にこの行を削除できます。ただし、もしも福岡に複数の部門がある場合には、これらの行が全て削除されることになります。UPDATE文やDELETE文で行を更新したり削除したりする場合には、なるべく対象行を一意に識別できるID列などを指定するとよいでしょう。
それでは、ここまでの結果をSELECT文で確認してみましょう。
SELECT * FROM dept;
今回は、基本的なINSERT文、UPDATE文、DELETE文の構文を説明しました。次回は、これらの構文を少し応用した、データの挿入と更新を同時に行う「MERGE文」や、相関副問合せと組み合わせた「相関UPDATE文」などをご紹介したいと思います。お楽しみに!
通常、アプリケーションやバッチ処理は複数のSQL文から構成されます。例えば、注文が入ったら、注文表に注文データをINSERTし、さらに在庫表をUPDATEして在庫数を減らす、という処理が必要かもしれません。このような「関連する一連の処理」を、データベースではこれを「トランザクション」という概念であらわします。
複数の関連する処理を「トランザクション」として定義することで、関連する処理をまとめて「確定(COMMIT)」または「取り消し(ROLLBACK)」できます。これによって、例えば「注文情報のINSERTは成功したけれど、在庫数を減らす処理が失敗した」という、処理上の不整合をなくせます。
データベースでは、接続して最初の処理を開始してから、処理を「確定(COMMIT)」するか、または「取り消し(ROLLBACK)」するまでが一連のトランザクションであると見なされます。
実は今回使用しているAPEX環境では、SQL文の実行後に、自動的に確定処理(COMMIT)が実行されています。そのため、明示的に「COMMIT」コマンドを使用しなくても、INSERTやUPDATE、DELETE処理が確定します(そのため、取り消し(ROLLBACK)することもできません)。
しかし、一般的なSQL実行ツール(SQL*Plusなど)では、明示的に「COMMIT」コマンドを実行するまで処理が確定しない(保存されない)ものがほとんどです。一連の処理が完了したら「COMMIT」コマンドを実行するのを忘れないようにしてください。COMMITせずにツールを終了すると、処理が確定せず、変更が失われて(自動的にROLLBACKされて)しまいます。また、一連の処理を明示的に取り消したい場合には「ROLLBACK」コマンドで処理を取り消します。
Copyright © ITmedia, Inc. All Rights Reserved.