ど素人から毛を生やす。<延>

[MySQL]INSERT ... ON DUPLICATE KEY UPDATE 構文を SELECT UPDATE ... GROUP BY で使う

Web > Other 2022年3月3日(最終更新:2年前)

2022年3月3日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。

以前、MySQLで「キーが存在していたらUPDATE、していなかったらINSERT」を行う関数として「INSERT … ON DUPLICATE KEY UPDATE」構文を紹介しましたが、これをINSERT SELECT構文で使用したくなりました。

table_a(
	`id` INT NOT NULL DEFAULT 0,
	`count` INT NOT DEFAULT NULL,
	PRIMARY KEY (`id`)
) ;

INSERT INTO table_a
	SELECT table_b.`id`, table_b.`count`
	FROM table_b
ON DUPLICATE KEY UPDATE table_a.`count` = table_b.`count`;
#結果:成功

INSERT INTO table_a
	SELECT table_b.`id`, table_b.`count`
	FROM table_b
	GROUP BY table_b.id
ON DUPLICATE KEY UPDATE table_a.`count` = table_b.`count`;
#結果:Unknown column 'table_b.count' in 'field list'

INSERT INTO table_a
	SELECT table_b.`id`, COUNT(table_b.*) AS cnt
	FROM table_b
	GROUP BY table_b.`id`
ON DUPLICATE KEY UPDATE table_a.`count` = table_a.`count` + table_b.COUNT(*);
#結果:Invalid use of group function

どうやら、GROUPとON DUPLICATE KEY UPDATEは共存できないらしい。

で、解決法としてはGROUPしたテーブルをサブクエリ化して、GROUP化されていない一時テーブルを参照する他なさそうです。

INSERT INTO table_a
	SELECT table_sub.`id`, table_sub.cnt
	FROM (SELECT table_b.`id`, COUNT(table_b.*) AS cnt
		  FROM table_b
		  GROUP BY table_b.`id`
		  ) AS table_sub
ON DUPLICATE KEY UPDATE table_a.`count` = table_a.`count` + table_sub.cnt
#結果:成功

これで解決。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)