第3章 SQL構文

UPDATE構文:データを更新する

UPDATE構文

UPDATEは、レコードを更新するための構文で、すべてのレコードを一括更新、もしくは条件式を満たす特定のレコードだけを更新することができます。使い方は、INSERT構文と同様にSET句で更新するフィールドと値を指定します。

UPDATEで特定のレコードのみを更新対象にする場合は、WHERE句に条件式を設定します。 条件に当てはまるレコードが存在しない場合は更新されませんが、文法的に正しいのでエラーにはなりません。

単一テーブル構文
UPDATE [LOW_PRIORITY]
[IGNORE] テーブル名
    SET フィールド名=値, [フィールド名=値, ...]
    [WHERE 条件式]
    [ORDER BY ...]
    [LIMIT 値]
複合テーブル構文
UPDATE [LOW_PRIORITY]
[IGNORE] テーブル名の参照
    SET フィールド名=値, [フィールド名=値, ...]
    [WHERE 条件式]
UPDATE構文のキーワード
パラメータ 説明
LOW_PRIORITY テーブルを利用するクライアントがなくなるまで待ってから、UPDATEを実行します。
WHERE 条件式にマッチするレコードを選択します。
 
LIMIT 更新するレコード数を指定します。
IGNORE 通常処理では、レコード更新の際にPRIMARYやUNIQUEと定義されたフィールドで値の重複がある場合、エラーが発生します。IGNOREを宣言しておくと、レコードの更新が行われないのは同じですが、エラーが発生しません。
ORDER BY 指定された順序でレコードを更新します。

UPDATE構文の使用例

それでは、UPDATE構文を使って商品テーブルの内容を変更してみましょう。変更する対象は[商品ID(id_g)]の値が"3"のレコード、[商品名(name)]"Saxophone Colussus"です。変更する内容は[商品名(name)]と[価格(price)]です。

商品ID(id_g) 商品名(name) 価格(price)
3 Saxophone Colossus NULL

特定の1件のレコードを指定する場合は、WHERE句の条件式にプライマリキーとなるフィールド名を指定します。プライマリキーの値は1つのテーブル内でユニークだということが保障されているので、間違えて関係のないレコードも変更してしまうといったミスを避けることができます。商品テーブルのプライマリキーは[商品ID(id_g)]なので、任意のレコードを選択するには、条件式で[商品ID(id_g)]を指定します。

レコードの更新

それでは、UPDATE構文を使ってレコードを更新してみましょう。まず、UPDATEの後に変更したいテーブル名を指定し、SET句で変更するフィールド名と値を指定します。最後に、WHERE句の条件式に変更するレコードのプライマリキーを指定します。

UPDATE goods
	SET name='Electric Ladyland', price=2100
	WHERE id_g=3;
変更内容の確認

UPDATEで更新した内容を、SELECTで確認します。

SELECT * FROM goods WHERE id_g=3;
+------+-------------------+-------+
| id_g | name              | price |
+------+-------------------+-------+
|    3 | Electric Ladyland |  2100 |
+------+-------------------+-------+
商品ID(id_g) 商品名(name) 価格(price)
3 Electric Ladyland 2100

UPDATE構文で注意したいのが、WHERE句の部分です。WHERE句は省略可能ですが、WHERE句で変更対象のレコードを選択しなかった場合、すべてのレコードが変更されます。UPDATE構文を使う際は十分な注意が必要です。

式を使ったレコードの更新

フィールドを更新する際に、フィールドの値を直接指定する代わりに、式を指定することもできます。たとえば、商品テーブルの[価格(price)]フィールドを税込価格にするには、税込価格を計算してから更新処理をする必要はありません。クエリの中で[価格(price)]フィールドの値に5%をかけて、税込価格を代入します。

UPDATE goods SET price = price * 1.05;
更新前の商品テーブル
商品ID(id_g) 商品名(name) 価格(price)
1 Afro-American-Arctic 2300
2 Ready To Die 1800
3 Electric Ladyland 2100
~省略~
更新後の商品テーブル
商品ID(id_g) 商品名(name) 価格(price)
1 Afro-American-Arctic 2415
2 Ready To Die 1890
3 Electric Ladyland 2205
~省略~

UPDATEは左から右に評価します。たとえば、次のクエリは[商品番号(id_g)]"3"の[価格(price)] フィールドに"3200"を代入し、そのあと1.05倍しています。

UPDATE goods 
	SET price = 3200, price = price * 1.05
	WHERE id_g = 3;
更新前の商品テーブル
商品ID(id_g) 商品名(name) 価格(price)
3 Electric Ladyland 2205
更新後の商品テーブル
商品ID(id_g) 商品名(name) 価格(price)
3 Electric Ladyland 3360

複数のテーブルに対するUPDATE

複数のテーブルに対するUPDATE操作も実行可能です。

UPDATE goods, goods_new 
	SET goods.price=goods_new.price
	WHERE goods.id_goods=goods_new.id_goods;

上の例では、カンマ演算子を使用した内部結合を示していますが、複数テーブルのUPDATE構文では、LEFT JOINなど、SELECT構文で使用可能な結合型を使用することができます。

※複数テーブルのUPDATE では、ORDER BYとLIMITがサポートされません。

関連記事