[MySQL] INSERT … ON DUPLICATE KEY UPDATE … でハマったの


PHP 5.2.10 MySQL 5.1 にて。

MySQLの構文にINSERT … ON DUPLICATE KEY UPDATE …というものがあります、
primary keyおよびUnique keyで重複するキーがある場合はUPDATE、重複しない場合はINSERT してくれるという
大変良い感じの構文なのですが mysql_insert_id()の挙動でちょっとはまってしまったのでメモ。

以下のような、SQLを発行しmysql_insert_id()を実行してみる



# こんな感じのテーブル構造でテスト
CREATE TABLE `testa` (
  `a` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `b` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

# 以下を実行
INSERT INTO testa (`a`, `b`) VALUES (1, 2) ON DUPLICATE KEY UPDATE `b` = 2;
# mysql_insert_id() = 1になる

# さらに`b`の値を変更するSQLも発行してみる
# INSERT INTO testa (`a`, `b`) VALUES (1, 3) ON DUPLICATE KEY UPDATE `b` = 3;
# 同じようにmysql_insert_id() = 1 になる


# しかし値が全く同じの場合はというと
# INSERT INTO testa (`a`, `b`) VALUES (1, 3) ON DUPLICATE KEY UPDATE `b` = 3;
# 同じようにmysql_insert_id() = 0 になる!

というように「0」を返してくるので注意

ちなみに SELECT ROW_COUNT();をするとINSERTかUPDATEか変更されていないかがわかる模様
SELECT ROW_COUNT();
 # 0 - 変更なし
 # 1 - INSERT
 # 2 - UPDATE 

Comments are closed.