💬

DUPLICATE KEY UPDATEでwarningが出てたので調べてみた

2023/06/05に公開

実装環境など

  • 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のドキュメントにも中間あたりに注記として記載がありました
https://dev.mysql.com/doc/refman/8.0/ja/insert-on-duplicate.html

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