|
大量の新規登録と更新が混在しているCSVファイルを効率よくUPSERTしたい。 テストデータ作成†バージョン確認 SELECT version(); +-----------+ | version() | +-----------+ | 5.7.36 | +-----------+ product_code と item_code の組み合わせでユニーク。 テーブル作成 CREATE TABLE product (
id int AUTO_INCREMENT PRIMARY KEY,
product_code varchar(255) NOT NULL,
item_code varchar(255) NOT NULL,
product_name varchar(255) NOT NULL,
UNIQUE product_idx (product_code, item_code)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
テストデータ登録 INSERT INTO product (product_code, item_code, product_name) VALUES
('pcode1', 'icode1', 'product1'),
('pcode2', 'icode2', 'product2'),
('pcode3', 'icode3', 'product3');
確認 SELECT * FROM product; +----+--------------+-----------+--------------+ | id | product_code | item_code | product_name | +----+--------------+-----------+--------------+ | 1 | pcode1 | icode1 | product1 | | 2 | pcode2 | icode2 | product2 | | 3 | pcode3 | icode3 | product3 | +----+--------------+-----------+--------------+ REPLACEは使えない†pcode1 の product_name を変更してみる。 REPLACE product (product_code, item_code, product_name) VALUES ('pcode1', 'icode1', 'productA');
Query OK, 2 rows affected (0.01 sec)
2 rows になるのはDELETEとINSERTが実行されるため。 確認 SELECT * FROM product; +----+--------------+-----------+--------------+ | id | product_code | item_code | product_name | +----+--------------+-----------+--------------+ | 2 | pcode2 | icode2 | product2 | | 3 | pcode3 | icode3 | product3 | | 4 | pcode1 | icode1 | productA | +----+--------------+-----------+--------------+ id が 1 だったものが 4 になっているのでREPLACEは使えない。 ELTとFIELDを使う†良い感じで実現できるらしいが記述がややこしかったので却下。 ON DUPLICATE KEY UPDATEを使う†pcode1の商品名を戻して、pcode4を登録してみる。 INSERT INTO product (product_code, item_code, product_name) VALUES
('pcode1', 'icode1', 'product1'),
('pcode4', 'icode4', 'product4')
ON DUPLICATE KEY UPDATE product_name = VALUES(product_name);
Query OK, 3 rows affected (0.01 sec)
Records: 2 Duplicates: 1 Warnings: 0
確認 SELECT * FROM product; +----+--------------+-----------+--------------+ | id | product_code | item_code | product_name | +----+--------------+-----------+--------------+ | 2 | pcode2 | icode2 | product2 | | 3 | pcode3 | icode3 | product3 | | 4 | pcode1 | icode1 | product1 | | 5 | pcode4 | icode4 | product4 | +----+--------------+-----------+--------------+ idは変わらず変更され、期待通りに登録された。 |