どもです。
以前、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
#結果:成功
これで解決。