【MySQL入門】UPDATEでデータを更新!一括更新から条件付き更新まで

皆さんMySQLつかっていますか?

今回はUPDATE文について学習していきます。UPDATEを使うことで、様々な方法でデータを更新することができます。

この記事ではUPDATEの基本から、データの一括更新と特定の条件を指定した更新の方法をお伝えしてきます。データ更新について、サクッとマスターしてしまいましょう!

目次

UPDATE文の基本

まずはUPDATE文の基本からです。

シンプルなUPDATE文

UPDATE文は冒頭でもお伝えしたとおり、データの更新を行うためのSQL文です。一番シンプルな書式は次のようになります。

  • UPDATE テーブル名 SET カラム名 = 値;

このように書くと、「テーブル名」にある「カラム名」のカラムに格納されているすべての値が「値」に更新されます。レコードが何千件あっても一括で更新できるため、新しいカラムを追加したときなどに利用されます。

ただ、裏を返せばこのコマンド一つで何千件分ものデータを吹き飛ばしてしまうこともできるので、使用には細心の注意が求められます。初心者がクリティカルなデータベースを扱う場合は–safe-updates オプションを使うという方法があります。

このオプションはUPDATE文を実行する際、このあとで説明するWHERE条件をつけないと実行できなくなる、というオプションです。使い方は、MySQL起動時に次のように設定するだけです。

mysql -u root -p --safe-updates

この状態で次のようなクエリを実行すると、下のようなエラーを吐いて実行が阻止されます。

UPDATE testtable SET age = 0;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.

WHEREが付いていないような、UPDATEやDELETEの対象が一意に決まらない処理は実行できなくなるわけです。初心者のうちは、念のためにこのオプションを付けながらデータベースを扱うと良いかもしれません。

条件をつけたUPDATE文

シンプルなUPDATE文は一括更新には便利ですが、多くの場合、更新するのは特定のデータに限定されることが普通でしょう。

では、特定のデータのみを更新するにはどうするかというと、WHERE句をつけることで対応します。書式

  • UPDATE テーブル名 SET カラム名 = 値 WHERE 条件;

実際のクエリを見たほうがわかりやすいので、テーブルを作成して動かしてみましょう。まずは下のテーブルを作成してください。

CREATE DATABASE update_db;
USE update_db;
CREATE TABLE update_table (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `age` INT NOT NULL,
  PRIMARY KEY (`id`));

INSERT INTO update_table (name, age) VALUES
('タロー',25),
('ジロー',24),
('サブロー',22);

SELECT * FROM update_table;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | タロー   |  25 |
|  2 | ジロー   |  24 |
|  3 | サブロー |  22 |
+----+----------+-----+
3 rows in set (0.00 sec)

このようなテーブルができていればまずはオッケーです。では、サブローの年齢を19歳に修正してみます。必要なクエリは次のとおりです。

UPDATE update_table SET age = 19 WHERE id = 3;

成功すると次のように表示されます。

Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

更新されているかどうか、実際に見てみましょう。

SELECT * FROM update_table;

実行結果

+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | タロー   |  25 |
|  2 | ジロー   |  24 |
|  3 | サブロー |  19 |
+----+----------+-----+
3 rows in set (0.00 sec)

たしかに、サブローの年齢のみが書き換わっているのが確認できました。

UPDATE文を使った一括更新

ここからはUPDATEを使った応用的な操作をみていきましょう。まずはカラムの追加に合わせた一括更新です。カラムを追加した際、とりあえず特定の初期値で埋めておきたい、そんな場面で有効な方法です。

今回は先程から使っているテーブルにテスト結果のカラムを追加して、初期値として「未測定」を設定してみましょう。実際に使うクエリは次のとおりです。

ALTER TABLE update_table ADD score VARCHAR(3) NOT NULL;
UPDATE update_table SET score = '未測定';

実行結果

+----+----------+-----+--------+
| id | name     | age | score  |
+----+----------+-----+--------+
|  1 | タロー   |  25 | 未測定 |
|  2 | ジロー   |  24 | 未測定 |
|  3 | サブロー |  19 | 未測定 |
+----+----------+-----+--------+
3 rows in set (0.00 sec)

スコアの部分が一括で更新できましたね。レコードが3個ぐらいだとありがたみが薄いですが、UPDATEはレコードがどれだけ多くても一気に書き換えることができます。

繰り返しになりますが、間違った使い方をすれば重要なデータが一瞬で吹き飛ぶので、くれぐれも細心の注意を払って利用してください。

UPDATE文で条件を指定して更新

最後に条件をうまく利用することですこし凝った更新をしてみましょう。今回はテスト結果の上位2名に「勝ち」と表示させてみます。どんな条件を使えば実現できるか少し考えてみてください。

それでは、実際に使ったクエリです。

UPDATE update_table SET score = 68 WHERE id = 1;
UPDATE update_table SET score = 72 WHERE id = 2;
UPDATE update_table SET score = 85 WHERE id = 3;

ALTER TABLE update_table ADD judge VARCHAR(3) NOT NULL;
UPDATE update_table SET judge = '-';

UPDATE update_table SET judge = '勝ち' 
ORDER BY score DESC LIMIT 2 ;

SELECT * FROM update_table;

実行結果

+----+----------+-----+-------+-------+
| id | name     | age | score | judge |
+----+----------+-----+-------+-------+
|  1 | タロー   |  25 | 68    | -     |
|  2 | ジロー   |  24 | 72    | 勝ち  |
|  3 | サブロー |  19 | 85    | 勝ち  |
+----+----------+-----+-------+-------+
3 rows in set (0.00 sec)

では、クエリで何をやっていったのかをみていきましょう。まず最初の3行はスコアにデータを入力しているだけです。続く2行で判定用のjudgeカラムを作り、初期値に「-」を入れました。その次のクエリが今回一番注目してほしいところで、前半部分は今まで学んできたとおりのUPDATE文です。

そして、後半が新しく登場する部分、ORDER BY句とLIMIT句です。ORDER BYはカラム名を指定し、そのカラム名を整列させる効果があります。

並べ方には小さいものから大きなものへ並べる昇順と大きなものから小さなものへと並べる降順があります。ORDER BYではカラム名の後ろにASC/DESCをつけることで昇順・降順を切り替えることができます。

何もつけない場合は昇順で動作することも合わせて覚えておきましょう。今回はスコアの大きい順に並べるためにORDER BY score DESCを利用しました。

そして、もう一つがLIMIT句です。LIMITは整数を同時に指定することで、その整数分だけ範囲を制限することができます。今回の使い方では上位2人だけを制限するために降順で並べ替えたあと、LIMIT 2の制限をかけました。

これにより、スコア上位2名に制限がかけられたわけです。あとは、UPDATEで制限をかけた対象のカラムの値を更新する、というのが今回のクエリになります。

UPDATEに限らずORDER BYとLIMITの合わせ技はいろいろな場面で役に立つので、まとめて覚えておくといいですね。このようにして、スコアの上位2名に「勝ち」と表示させることができました。

まとめ

いかがでしたか?今回はUPDATEについて基本的な部分から、一括更新・条件設定をした更新と見てきました。UPDATEは一気に書き換える能力が高いため、扱いを間違えると大惨事を引き起こしかねません。

ですが、うまく使うことで柔軟にデータを更新することができ、役に立つ場面はとても多いものです。ぜひ、しっかりと習得して、何も問題なく更新手続をこなせるようになりましょう。この記事が皆様のMySQL学習の一助となれば幸いです。

この記事を書いた人

フリーのエンジニア・ライター。
プログラミング、ライティング、マーケティングなど、あらゆる手段を駆使して、
ハッピーなフルリモートワーカーを目指し中。

最近興味がある分野は深層強化学習。
積みゲー、積ん読がどんどん増加しているのがここ数年の悩み。
実は侍エンジニア塾の卒業生だったりします。

目次