💬
DUPLICATE KEY UPDATEでwarningが出てたので調べてみた
実装環境など
- mysql Ver 8.0.32 for Linux on aarch64 (MySQL Community Server - GPL)
何でエラーが出たのか
今回テスト用にこんなテーブルを作成
CREATE TABLE `hoge` (
`id` int unsigned NOT NULL COMMENT 'ID',
`fuga` int unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);
何も考えないでよくあるDUPLICATE KEY UPDATEを実行するとwarningが発生しました
mysql> INSERT INTO `hoge` VALUES(1, 10)
-> ON DUPLICATE KEY UPDATE `fuga` = VALUES(`fuga`);
Query OK, 1 row affected, 1 warning (0.02 sec)
とりあえずwarningを確認してみる
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Warning
Code: 1287
Message: 'VALUES function' is deprecated and will be removed in a future release. Please use an alias (INSERT INTO ... VALUES (...) AS alias) and replace VALUES(col) in the ON DUPLICATE KEY UPDATE clause with alias.col instead
1 row in set (0.01 sec)
mysqlのドキュメントにも中間あたりに注記として記載がありました
MySQL 8.0.20移行のヴァージョンではVALUES()の使用は非推奨なのでaliasを使ってとのこと
VALUES()を使用しないでaliasを使用してみる
テーブルのみのalias
INSERT INTO `hoge` VALUES(1, 10) AS `new`
ON DUPLICATE KEY UPDATE `fuga` = `new`.`fuga`;
Query OK, 2 rows affected (0.02 sec)
columnもalias
INSERT INTO `hoge` VALUES(1, 10) AS `new`(`a`, `b`)
ON DUPLICATE KEY UPDATE `fuga` = `b`;
Query OK, 2 rows affected (0.02 sec)
複数行もでもそのまま使用できる
INSERT INTO `hoge` VALUES(1, 10),(2, 20)AS `new`(`a`, `b`)
ON DUPLICATE KEY UPDATE `fuga` = `b`;
Query OK, 1 row affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
Discussion