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

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

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

どもです。

以前、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)
%d人のブロガーが「いいね」をつけました。