DBD::mysql で insert on duplicate をした際に $sth->rows の返す結果が insert されなかった場合: 1 insert された場合: 1 update された場合: 2 となっていて mysql に繋いで直接コマンドを打った場合の affected rows と違って困るなぁと思っていたのですが How to obtain the number of rows affected by a statement in MySQL - O'Reilly Answers こういうことらしく matched rows を返すとのこと。 mysql_client_found_rows=0とすることで、 insert されなかった場合: 0 insert された場合: 1 update された場合: 2 となってしたいことの要件を満たしてくれました。