MySQLのON DUPLICATE KEY UPDATE
句を使用すると、1つのクエリで挿入(INSERT)と更新(UPDATE)を同時に行うことができます。
この機能は特に大量のデータを効率的に処理する際に非常に有用です。
重要な注意点
重要: ON DUPLICATE KEY UPDATE
を使用するには、対象のテーブルにユニーク制約またはプライマリキーが設定されている必要があります。
これらの制約がないと、重複を正しく検出できません。
基本的な使用方法
以下に、一般的な商品マスターテーブルを例にして、ON DUPLICATE KEY UPDATE
の使用方法を説明します。
まず、以下のような商品テーブルを想定します:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
product_code VARCHAR(50) UNIQUE,
name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
stock INT NOT NULL
);
この例では、id
がプライマリキーで、product_code
にユニーク制約が設定されています。
挿入と更新を同時に行う
以下のクエリを使用すると、新しい商品の挿入または既存商品の更新を1回の操作で行えます:
INSERT INTO products (product_code, name, price, stock)
VALUES ('A001', 'スマートフォン', 50000, 100)
ON DUPLICATE KEY UPDATE
name = VALUES(name),
price = VALUES(price),
stock = stock + VALUES(stock);
このクエリの動作は以下の通りです:
-
product_code
が'A001'の商品が存在しない場合、新しい行が挿入されます。 -
product_code
が'A001'の商品が既に存在する場合、指定された列が更新されます。-
name
とprice
は新しい値で上書きされます。 -
stock
は既存の在庫数に新しい値を加算します。
-
複数行の一括処理
複数の商品を一度に処理することも可能です:
INSERT INTO products (product_code, name, price, stock)
VALUES
('A001', 'スマートフォン', 50000, 100),
('B002', 'ノートPC', 80000, 50),
('C003', 'ワイヤレスイヤホン', 15000, 200)
ON DUPLICATE KEY UPDATE
name = VALUES(name),
price = VALUES(price),
stock = stock + VALUES(stock);
このクエリは、3つの商品を一度に処理します。各商品について、新規挿入または更新が行われます。
条件付き更新
特定の条件下でのみ更新を行いたい場合は、IF
文を使用できます:
INSERT INTO products (product_code, name, price, stock)
VALUES ('A001', 'スマートフォン', 55000, 50)
ON DUPLICATE KEY UPDATE
name = VALUES(name),
price = IF(price < VALUES(price), VALUES(price), price),
stock = stock + VALUES(stock);
この例では、新しい価格が既存の価格より高い場合のみ、価格が更新されます。
まとめ
ON DUPLICATE KEY UPDATE
を使用することで、MySQLでの挿入と更新の処理を効率化できます。
ただし、この機能を使用するには必ずユニーク制約またはプライマリキーが設定されている必要があることを忘れないでください。
適切に使用すれば、データベース操作の簡素化と高速化に大きく貢献します。