MySQLでGROUP BYのように特定の1行だけ更新する方法|ORDER BYとLIMITを活用したUPDATE文の書き方
MySQLでは、UPDATE文の中でGROUP BYを直接使用することができません。しかし、「同じ値を持つ複数のレコードの中から、最初の1行だけを更新したい」というケースは実際の開発でよく発生します。
そんなときに役立つのが、ORDER BYとLIMITを組み合わせたUPDATE文です。この記事では、サンプルテーブルを使いながら、その具体的な手順をわかりやすく解説します。
1. サンプルテーブルを作成する
まず、従業員情報を格納するテーブル「DemoTable2018」を作成します。テーブルには、自動採番される主キー「EmployeeId」、従業員名「EmployeeName」、給与「EmployeeSalary」の3つのカラムを定義します。
mysql> create table DemoTable2018
-> (
-> EmployeeId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> EmployeeName varchar(20),
-> EmployeeSalary int
-> );
Query OK, 0 rows affected (0.61 sec)
2. テストデータを挿入する
INSERTコマンドでレコードを追加します。ここでは意図的に「Chris」という同名の従業員を2人登録し、複数件ヒットする状態を作ります。
mysql> insert into DemoTable2018(EmployeeName,EmployeeSalary) values('Chris',10000);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable2018(EmployeeName,EmployeeSalary) values('David',12560);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable2018(EmployeeName,EmployeeSalary) values('Chris',25400);
Query OK, 1 row affected (0.09 sec)
3. 登録データを確認する
SELECT文ですべてのレコードを表示して、データが正しく登録されているか確認しましょう。
mysql> select *from DemoTable2018;
実行結果は以下の通りです。
+------------+--------------+----------------+ | EmployeeId | EmployeeName | EmployeeSalary | +------------+--------------+----------------+ | 1 | Chris | 10000 | | 2 | David | 12560 | | 3 | Chris | 25400 | +------------+--------------+----------------+ 3 rows in set (0.00 sec)
このように、「Chris」のレコードが2件(EmployeeId=1 と 3)存在していることがわかります。
4. ORDER BYとLIMITを使って1行だけ更新する
ここが本題です。WHERE句で「EmployeeName='Chris'」と指定しつつ、ORDER BYで並べ替え、LIMIT 1を付けることで、条件に合うレコードのうち先頭の1行だけを更新できます。
mysql> update DemoTable2018
-> set EmployeeSalary=EmployeeSalary+2500 where EmployeeName='Chris'
-> order by EmployeeId limit 1;
Query OK, 1 row affected (0.13 sec)
Rows matched: 1 Changed: 1 Warnings: 0
このクエリでは、名前が「Chris」のレコードを従業員IDの昇順に並べ替え、先頭行(EmployeeId=1)の給与にのみ2500を加算しています。「Rows matched: 1 Changed: 1」と表示されている通り、更新されたのは1行だけです。
ポイント: UPDATE文でのORDER BYやLIMITの指定は、単一テーブルに対するUPDATE構文でのみ有効です。複数テーブルを結合したUPDATEでは使用できないため注意が必要です。
5. 更新後のデータを確認する
もう一度テーブルの中身を確認して、意図した通りの更新になっているかチェックしましょう。
mysql> select *from DemoTable2018;
実行結果:
+------------+--------------+----------------+ | EmployeeId | EmployeeName | EmployeeSalary | +------------+--------------+----------------+ | 1 | Chris | 12500 | | 2 | David | 12560 | | 3 | Chris | 25400 | +------------+--------------+----------------+ 3 rows in set (0.00 sec)
EmployeeId=1の「Chris」の給与だけが10000から12500に更新され、EmployeeId=3の「Chris」(25400)は元のまま変更されていないことが確認できます。
まとめ
MySQLのUPDATE文ではGROUP BYを使用できませんが、WHERE句で条件を絞り込み、ORDER BYとLIMITを組み合わせることで「該当レコードのうち最初の1行だけを更新する」という処理を実現できます。重複データの中から特定の1件だけを修正したい場合などに、ぜひ活用してみてください。
-
JavaでMySQLデータベースのレコードを更新する方法【UPDATE文の使い方を実例で解説】
MySQLデータベースのテーブルに格納されたデータを更新するには、UPDATEコマンドを使用します。本記事では、UPDATE文の基本構文から、実際にテーブルを作成し、Java(JDBC)経由でレコードを更新するまでの一連の手順を、サンプルコード付きで詳しく解説します。 UPDATE文の基本構文 MySQLで既存のデータを更新する場合、以下の構文を使用します。 update テーブル名 set カラム名1 = 値1, ....N where 条件; where句で条件を指定しないと、テーブル内のすべてのレコードが更新されてしまうため注意が必要です。 ステップ1:テーブルの作成 まずは更新用のサン
-
JavaのPreparedStatementを使ってMySQLテーブルを更新する方法
JavaからMySQLのテーブルを更新するには、PreparedStatementを使用するのが一般的で安全な方法です。PreparedStatementを使うことで、SQLインジェクションを防ぎつつ、パラメータを動的に設定できます。この記事では、実際にテーブルを作成し、Javaプログラムからレコードを更新するまでの一連の手順を解説します。1. テーブルの作成まず、MySQLで更新用のテーブルを作成しましょう。mysql> create table DemoTable( Id int, FirstName varchar(40) ); Query OK, 0 rows a