MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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処理へ切り替わることが確認できます。重複データを許可せず、既存レコードを効率的に更新したい場合に、この手法は非常に便利です。

  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

  2. MySQLテーブルを一括更新する方法|ADDTIME関数で複数行の時刻データをまとめて変更

    MySQLでは、UPDATE文と関数を組み合わせることで、テーブル内の複数のレコードを一度に一括更新(バッチ更新)できます。本記事では、時刻型(TIME型)のカラムに対してADDTIME関数を使い、すべての行の時刻をまとめて加算・更新する手順を、実際のSQL文と実行結果付きでわかりやすく解説します。1. サンプルテーブルを作成するまず、時刻データを格納するためのテーブル「DemoTable」を作成します。mysql> create table DemoTable    -> (    -> Bre