Search code examples
mysqlsqlprepared-statementinnodb

auto-increment value in update conflicts with internally generated values


I've been getting this error from an insert on duplicate update query in MYSQL randomly every now and then. Any idea what's going on? I can't seem to reproduce the error consistently it occurs sometimes and then sometimes not.

Here is the query in question:

INSERT INTO friendships (u_id_1,u_id_2,status) VALUES (?,?,'active') ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);

And the schema describing the table is:

DROP TABLE IF EXISTS `friendships`;
CREATE TABLE `friendships` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `u_id_1` int(11) NOT NULL,
  `u_id_2` int(11) NOT NULL,
  `status` enum('active','pending','rejected','blocked') DEFAULT 'pending' NOT NULL,
  `initiatiator` enum('1','2','system') DEFAULT 'system' NOT NULL,
  `terminator` enum('1','2','system') DEFAULT NULL,
  `confirm_timestamp` timestamp DEFAULT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`u_id_1`,`u_id_2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Solution

  • Your ON DUPLICATE KEY UPDATE statement isn't helping you at all here.

    You are taking the LAST_INSERT_ID, which is the auto inc of the last successfully inserted row, and trying to update the duplicated row with that id. This will always cause a duplicate primary (you're trying to change the id of some row to match the id of the last thing you added)