【MySQL】レコードの存在確認と重複時の列の上書き更新を行う方法(INSERT ... ON DUPLICATE KEY UPDATE)
MySQLで「レコードが存在しない場合は挿入し、すでに存在する場合は指定した列の値を上書きしたい」というケースがあります。このような場合には、INSERT ... ON DUPLICATE KEY UPDATE 構文を使用します。この記事では、具体的なサンプルコードとともにその使い方を解説します。
サンプルテーブルの作成
まず、FirstName 列に UNIQUE キーを設定したテーブルを作成します。UNIQUE キーがあることで、重複データの挿入が検出されるようになります。
mysql> create table DemoTable1891
(
FirstName varchar(20),
UNIQUE KEY(FirstName)
);
Query OK, 0 rows affected (0.00 sec)INSERT ... ON DUPLICATE KEY UPDATE でレコードを挿入
次に、INSERT 文に ON DUPLICATE KEY UPDATE を組み合わせてレコードを挿入します。重複が発生した場合は、UPDATE 句で指定した内容に上書きされます。
mysql> insert into DemoTable1891 values('Chris') on duplicate key update FirstName='Robert';
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1891 values('David') on duplicate key update FirstName='Robert';
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1891 values('Chris') on duplicate key update FirstName='Robert';
Query OK, 2 rows affected (0.00 sec)実行結果の確認
SELECT 文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1891;
実行結果は以下のようになります。
+-----------+ | FirstName | +-----------+ | David | | Robert | +-----------+ 2 rows in set (0.00 sec)
動作のポイント
- 1回目・2回目の INSERT では、「Chris」「David」はまだ存在しないため、通常どおり新規挿入されます(1 row affected)。
- 3回目の INSERT では、UNIQUE キーにより「Chris」の重複が検出され、ON DUPLICATE KEY UPDATE が機能して FirstName が「Robert」に上書き更新されます。
- その結果、テーブルには「David」と「Robert」の2件のみが残ります。
このように INSERT ... ON DUPLICATE KEY UPDATE を使えば、存在チェックと更新処理を1つの SQL で簡潔に実現できます。アプリケーション側で SELECT してから INSERT/UPDATE を分岐させる必要がないため、処理の効率化にもつながります。
-
【MySQL】集計関数の結果と他のすべての列を同時に取得する方法
MySQLでは、MAX()やSUM()などの集計関数を使う際、通常はGROUP BYが必要になります。しかし、「テーブルの全行をそのまま表示しながら、集計結果も一緒に取得したい」というケースもあります。本記事では、サブクエリ(スカラーサブクエリ)を活用して、すべての列と集計関数の結果を1つのクエリで同時に取得する方法を解説します。1. サンプルテーブルを作成するまず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable1621 -> ( -> StudentId int NOT NULL AUTO_INCREMENT P
-
MySQLのバージョンを確認する方法をわかりやすく解説
この記事では、現在利用しているMySQLサーバーのバージョンを確認する方法について詳しく解説します。コンソールでクエリを実行する前に、まずクライアントがサーバーに正しく接続されていることを確認しておきましょう。接続が確立されていないと、クエリを実行しても結果を取得できません。MySQLのバージョンを確認する基本クエリ以下のクエリを実行すると、使用中のサーバーのバージョン番号と、実行時点の日付を同時に取得できます。mysql> SELECT VERSION(), CURRENT_DATE;ポイント: 関数「VERSION()」や「CURRENT_DATE」は大文字・小文字を区別しません。つ