ywork2020.com

Title

テーブルのデータを更新する

目次 (INDEX)

UPDATEとは

ここで説明する UPDATE とは次の語句からなる SQL です。
update
読み: アップデート
意味: 更新、改訂

目次に戻る

UPDATE文の概要

このUPDATE文は、既にあるデータテーブルの登録データを更新するために使用します。

データ更新の際にはWHERE句でテーブル内の一意のキーを指定して更新するターゲットを特定することになります。

目次に戻る

UPDATE文のサンプルコード

それでは、既存のテーブルのデータを更新するための基本的なクエリをサンプルとともに 見ていきたいと思います。

UPDATEの構文

既存のテーブルデータを更新するにはUPDATE文を使用します。 UPDATEの後に半角スペースを入れてからテーブル名を指定します。次にSET句で更新するカラムとデータの関係を指定してから、 WHERE句で更新するレコードを特定するためのコンディションを指定します。

UPDATE テーブル名 SET カラム名 = 更新値 WHERE 主キーカラム名 = キー値;

ここでのWHEREコンディションは基本となるものであり、必ずしもこの様なフォーマットにしなければならないものではありません。

目次に戻る

サンプル: テーブルデータ

サンプルとしてのテーブルのデータを定義しておきます。 このサンプルを使って更新した結果を見ていきたいと思いますのでよろしくお願いします。

サンプルテーブル: テストの結果
id (主キー)氏名国語算数理科
s001Aさん907080
s002Bさん808090
s003CさんNULLNULLNULL
s004Dさん709080
s005Eさん807020

目次に戻る

サンプル: 単独データの更新処理

Eさんは理科で30点未満だったので、補習を受けて後日、再テストを受けたとします。 再テストの結果は60点でしたのでデータを更新する必要があります。 それではデータ更新するためのクエリサンプルを見てみましょう。

UPDATE テーブル名 SET 理科 = 60 WHERE id = "s005";
サンプルテーブル: テストの結果
id (主キー)氏名国語算数理科
s001Aさん907080
s002Bさん808090
s003CさんNULLNULLNULL
s004Dさん709080
s005Eさん807060

結果: このように、WHERE句で指定したコンディションで id = "s005" のレコードを検索して、理科のカラムの値を60に更新できました。

UPDATE文で最も注意を払うところはWHEREコンディションです。もし仮にWHERE句を付けないでクエリを実行したとすると 全生徒の理科の点数が60に更新されてしまいます。このようなクエリのミスによって大切なデータが間違って更新されては一大事 となりますので、このUPDATE文に限らず、INSERT文や他の更新クエリにはトランザクションを使用することをお勧めします。

目次に戻る

サンプル: 複数のカラムでのデータの更新処理

前項では一つのカラム名のデータ更新を行いましたが、複数のカラムを指定することもできます。 これは単純にSET句で「,」カンマ区切りによる更新データの列挙をするだけです。

それでは先ほどのテーブルをそのまま利用して更新をしてみたいと思います。 今回のテストの日にCさんは学校をお休みしたのでテストを後日、受けました。 現在、Cさんのテスト成績は登録されておらず、NULL値が入っていますので更新してみます。

コードの視認性の問題で複数行のコードにしました。 改行しても、各句の間には半角スペースが必要ですので注意してください。
UPDATE テーブル名 
	SET 国語 = 70, 算数 = 90, 理科 = 80 
	WHERE id = "s003";
サンプルテーブル: テストの結果
id (主キー)氏名国語算数理科
s001Aさん907080
s002Bさん808090
s003Cさん709080
s004Dさん709080
s005Eさん807060

以上でUPDATE文による更新の説明は終りにします。

次項ではトランザクションの基本の使い方を紹介していきます。

目次に戻る

トランザクションについて

ここでは、補足的ではありますが、トランザクションの基本について書いておこうと思います。

Transaction
読み: トランザクション
意味: データベースに関連する複数の処理の一時的な保管機構

この機能はデータベースでデータの追加処理や更新処理をする際に人為的ミスやネットワークエラーなどにより、更新の失敗が あった場合に、処理の一時的なバックアップ機能を使い元のデータに復元することを目的としています。

トランザクションで最も重要なキーワードは「全て成功か、全て失敗」というものです。 データベースに対する一連のクエリを一つの処理と考えた場合に処理の途中でネットワークエラーにより回線が遮断された場合、 処理途中でデータ更新が不可能となります。このような場合を想定して全ての処理が完全に終わったことが確認できた時点で「確定」 のクエリを発行します。また、全ての処理の完了が確認できない場合には「巻き戻し」のクエリを発行して、データを復元します。

これは人が、一つ一つのクエリを実行する場合はもとより、プログラムにSQLの発行を組み込んで使用する場合なら尚更、必須と なる機能です。

ここでのサンプルは一つ一つのクエリ発行で説明しますのでコードが一連で自動的に実行される訳ではないことを留意ながら見ていただきたいと思います。 あくまでも、一行単位でクエリを実行していると認識しながらご覧ください。

なお、MySQLのトランザクションは他のデータベースと少し仕様が異なりますので、MySQLで説明していこうと思います。

目次に戻る

MySQLのオートコミット機能について

MySQLでトランザクションを開始する前に設定しておかなければならない機能にオートコミット機能があります。 SQL Serverなどの他のデータベースを使用される場合には、この機能はありませんので気にしないでください。

まず、コミットについてですが、実際の言葉の意味からすると分かりづらいので、 データベースにおけるコミットとは「確定」と解釈してください。

通常、データベースではトランザクションを開始した場合に追加や更新のクエリを発行すると、「確定」のクエリを発行するまでは、 データの更新は一時的に保管されている状態になります。ここで、データが正しく追加、更新されているかの検証を行い、問題なければ コミットします。もし、問題があればロールバックで処理の巻き戻しをすることができます。

MySQLでは初期値でオートコミット機能がONになっており、トランザクションを開始しても処理途中でSELECT文などを発行した瞬間に 自動的に「確定」のクエリが発行されてしまいます。 このことからMySQLでトランザクションを利用する場合には、事前にこのオートコミット機能をOFFにする必要があります。

まず、オートコミット機能のON/OFFの確認をするクエリを見てみましょう。
SHOW VARIABLES LIKE 'autocommit';
続いて、オートコミット機能をOFFにするクエリです。ONにする場合には1を指定します。
SET autocommit = 0;

以上でオートコミット機能についての説明は終わりです。 次項ではトランザクションを使っての更新処理を見ていきます。

目次に戻る

サンプル: トランザクション

トランザクションは一連のクエリを実行していき、コミットするまでは処理の完了を確定させないためのものです。 一連のクエリでエラーやミスが発生した場合にはロールバックで元のデータに戻すことが目的です。

それでは今まで使ったサンプルをそのまま使ってトランザクションを利用した更新処理をみていきましょう。

まず、トランザクション開始するためのクエリです。
BEGIN;
たったこれだけのクエリでトランザクションが開始されます。 では、続いて更新処理をしてみましょう。 現在のテーブルデータは以下の通りです。
サンプルテーブル: テストの結果
id (主キー)氏名国語算数理科
s001Aさん907080
s002Bさん808090
s003Cさん709080
s004Dさん709080
s005Eさん807060
UPDATE テーブル名 SET 算数 = 70;
SELECT * FROM テーブル名;

結果を見てビックリ。WHERE句が無いミスに気がつきました。
サンプルテーブル: テストの結果
id (主キー)氏名国語算数理科
s001Aさん907080
s002Bさん807090
s003Cさん707080
s004Dさん707080
s005Eさん807060

クエリにミスがあったのでここでトランザクションの恩恵にあずかり、元に戻します。
ROLLBACK;

これでテーブルデータは元に戻りました。 今回はロールバックしましたが、更新に問題が無ければコミットで更新を保存します。

COMMIT;

以上でトランザクションの基本のお話しは終りにします。 このページでは手動でクエリを発行していくという形式でトランザクションを見ていきました。 これが他のプログラムを使ってクエリを発行していくというこになったとしても基本的な考え方は変わりません。

例えばINSERT文でレコードを追加する場合は下記のような手順になると思います。
  • レコード追加前のテーブルのレコード件数を調べる
  • これから追加するレコード件数を把握する
  • トランザクションを開始する
  • INSERT文によるレコードの追加をする
  • 追加処理後のテーブルレコードの件数が「元の件数 + 追加件数」と一致していればコミット
  • レコード件数が想定と不一致ならばロールバック

以上です。ありがとうございました。

目次に戻る

SQL の仕様上の注意点

※ SQL の予約句はアルファベットの大文字と小文字を区別しませんが、 任意で作成したデータベースやテーブル、カラムの名前などは区別されるので注意が必要です。

目次に戻る