на дублированном ключе не работает правильно, когда таблица является innodb. Это создает именно проблему, которую вы описываете. Если вам нужна функциональность innodb, тогда вы должны сначала проверить существование строки, иначе вы можете преобразовать таблицу в таблицу myisam.
изменить: если вам необходимо проверить существование строки до принятия решения о вставке или обновлении, я бы посоветовал вам использовать хранимую процедуру.
DELIMITER //
CREATE PROCEDURE adjustusers(IN pId int)
BEGIN
DECLARE userid int;
select count(id) into userid from users where id = pId;
if userid = 1 then
update users set id = pId where id = pId;
else
insert into users(id) values(pId);
end if;
END //
DELIMITER ;
Хранимая процедура предварительно скомпилирована, как подготовленный отчет. Следовательно, нет проблем с вложением SQL-запросов и некоторой дополнительной функциональностью и только один вызов в базу данных.
Пусть база данных вернет исключение на дубликат ключа и обработает его. –
Ключевое слово, которое вы ищете, это 'UPSERT'. – OldCurmudgeon