create table dummy ( id int auto_increment, name varchar(255) not null, bla varchar(255) not null, primary key (id), unique key(name) ) ENGINE=InnoDB; insert into dummy ( id, name, bla ) values ( NULL, "foo", "--" ) on duplicate key update bla = if (VALUES(bla) = "--", bla, VALUES(bla)); -- new row. correctly returns the new id (1) select last_insert_id(); insert into dummy ( id, name, bla ) values ( NULL, "foo", "--" ) on duplicate key update bla = if (VALUES(bla) = "--", bla, VALUES(bla)); -- no update. correctly returns 0 select last_insert_id(); insert into dummy ( id, name, bla ) values ( NULL, "foo", "XX" ) on duplicate key update bla = if (VALUES(bla) = "--", bla, VALUES(bla)); -- row updated. THIS RETURNS 2! WTF?? select last_insert_id(); insert into dummy ( id, name, bla ) values ( NULL, "foo", "XX" ) on duplicate key update bla = if (values(bla) = "--", bla, VALUES(bla)); -- no update. correctly returns 0 select last_insert_id();