There's an echo in my head

日々のメモ。

MySQLで実際にINSERTされたレコード数

INSERT INTO animals (id,name) 
VALUES (1,"dog"),(2,"cat"), ...
ON DUPLICATE KEY UPDATE name = VALUES(name)

みたいなクエリで重複することなく新規にINSERTされたレコード数は、VALUES句の要素数ROW_COUNT()とから算出できる。

VALUES句の要素数values_count、発行直後のROW_COUNT()の返り値がrow_countのとき、新規にINSERTされたレコード数inserted_countと重複によって更新されたレコード数updated_countの間には次の関係が成り立つ。

inserted_count + updated_count = values_count
inserted_count + 2 * updated_count = row_count

この連立方程式を解くと

inserted_count = 2 * values_count - row_count
updated_count = row_count - values_count

となる。

よって重複することなく新規にINSERTされたレコード数は2 * VALUES句の要素数 - ROW_COUNT()で決まる。

参考

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。