MySQLでON DUPLICATE KEY UPDATE用の一意制約(UNIQUE)を追加する方法
MySQLで特定のカラムに重複データが挿入されようとした際に「ON DUPLICATE KEY UPDATE」を正しく機能させるには、あらかじめそのカラムに一意制約(UNIQUE制約)を追加しておく必要があります。本記事では、制約の追加方法から実際の動作確認までを、サンプルコードとともにわかりやすく解説します。
制約を追加する基本構文
テーブルに一意制約を追加するには、以下の構文を使用します。
ALTER TABLE テーブル名 ADD CONSTRAINT 制約名 UNIQUE(カラム名);
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。ここでは「Name(名前)」と「Score(スコア)」の2つのカラムを持つテーブルを定義します。
mysql> CREATE TABLE DemoTable1459
-> (
-> Name VARCHAR(20),
-> Score INT
-> );
Query OK, 0 rows affected (0.72 sec)
Nameカラムに一意制約を追加する
次に、Nameカラムに対して一意制約を追加します。これにより、同じ名前のレコードが挿入されようとしたときに、重複エラーではなく更新処理へ切り替える準備が整います。
mysql> ALTER TABLE DemoTable1459 ADD CONSTRAINT Name_const UNIQUE(Name); Query OK, 0 rows affected (1.09 sec) Records: 0 Duplicates: 0 Warnings: 0
ON DUPLICATE KEY UPDATEを使ってレコードを挿入する
INSERT文でデータを挿入します。ポイントは、重複が発生した場合にScoreカラムの現在値に10を加算して更新するよう指定している点です。
mysql> INSERT INTO DemoTable1459 VALUES('Chris',57) ON DUPLICATE KEY UPDATE Score=Score+10;
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable1459 VALUES('David',89) ON DUPLICATE KEY UPDATE Score=Score+10;
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable1459 VALUES('Chris',78) ON DUPLICATE KEY UPDATE Score=Score+10;
Query OK, 2 rows affected (0.33 sec)
3つ目のINSERT文では、すでに登録済みの「Chris」という名前を挿入しようとしたため、新規追加ではなく既存レコードの更新が実行されました。実行結果に「2 rows affected」と表示されるのが、更新処理が行われた証拠です。
結果の確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> SELECT * FROM DemoTable1459;
実行結果は以下のとおりです。
+-------+-------+ | Name | Score | +-------+-------+ | Chris | 67 | | David | 89 | +-------+-------+ 2 rows in set (0.00 sec)
動作のポイント
注目すべきは「Chris」のスコアです。3回目のINSERT文では78という新しい値を指定しましたが、実際の結果は67になっています。これは、新規挿入ではなく既存レコード(スコア57)に対して「Score = Score + 10」という更新処理が適用され、57 + 10 = 67となったためです。
このように、一意制約を設定したカラムに重複した値を挿入しようとすると、自動的にUPDATE処理へ切り替わることが確認できます。重複データを許可せず、既存レコードを効率的に更新したい場合に、この手法は非常に便利です。
-
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
-
MySQLテーブルを一括更新する方法|ADDTIME関数で複数行の時刻データをまとめて変更
MySQLでは、UPDATE文と関数を組み合わせることで、テーブル内の複数のレコードを一度に一括更新(バッチ更新)できます。本記事では、時刻型(TIME型)のカラムに対してADDTIME関数を使い、すべての行の時刻をまとめて加算・更新する手順を、実際のSQL文と実行結果付きでわかりやすく解説します。1. サンプルテーブルを作成するまず、時刻データを格納するためのテーブル「DemoTable」を作成します。mysql> create table DemoTable -> ( -> Bre