mysqli::insert_id возвращает неправильный идентификатор для дублирующегося ключа

При использовании mysqli::insert_id в PHP для INSERT INTO ON DUPLICATE KEY UPDATE я продолжаю получать следующее автоматическое увеличение, а не обновленную строку, если строка обновляется. В той же базе данных, но в другой таблице, у меня нет такого поведения при использовании ON DUPLICATE KEY UPDATE. Вместо этого я получаю идентификатор обновленной строки. Но теперь по какой-то причине в новой таблице, которую я создал, я продолжаю получать следующий идентификатор, которого даже не существует. Обе таблицы относятся к MyISAM и имеют поле автоинкремента. Я не понимаю, почему они ведут себя по-разному.

Пример:

==================================
Table: example
==================================
id  |   unique_field    |   data
==================================
1   |   unique1         |   123
2   |   unique2         |   456

INSERT INTO
    example
SET
    unique_field = 'unique1',
    data = '321'
ON DUPLICATE KEY UPDATE
    data = '321'


// mysqli::insert_id returns 3 (not 1)!!

Любые идеи?


person quano    schedule 14.09.2011    source источник


Ответы (1)


Из руководства по mysql:

Если таблица содержит столбец AUTO_INCREMENT, а INSERT ... UPDATE вставляет строку, функция LAST_INSERT_ID() возвращает значение AUTO_INCREMENT. Если оператор вместо этого обновляет строку, LAST_INSERT_ID() не имеет смысла. Однако вы можете обойти это, используя LAST_INSERT_ID (expr). Предположим, что id — это столбец AUTO_INCREMENT. Чтобы сделать LAST_INSERT_ID() значимым для обновлений, вставьте строки следующим образом:

ВСТАВЬТЕ В таблицу (a,b,c) ЗНАЧЕНИЯ (1,2,3) ПРИ ОБНОВЛЕНИИ ДВОЙНОГО КЛЮЧА id=LAST_INSERT_ID(id), c=3; Опция DELAYED игнорируется при использовании ON DUPLICATE KEY UPDATE.

Надеюсь, это поможет.

person Wesley van Opdorp    schedule 14.09.2011
comment
Это действительно дает тот результат, на который я рассчитывал. Но я не понимаю, почему мне не нужно делать это для другой таблицы, которую я упомянул. - person quano; 14.09.2011
comment
Не могли бы вы опубликовать как примеры, так и структуры таблиц? - person Wesley van Opdorp; 14.09.2011
comment
Прости не могу. Однако я провел еще несколько экспериментов и заметил, что если я использую NOW() где-то на стороне UPDATE запроса, идентификатор станет таким же, как обновленная строка. Так странно. В основном это то, что отличает две таблицы с точки зрения вызываемых функций - я использую NOW() в одном из запросов на вставку-обновление, а не в другом. - person quano; 14.09.2011
comment
Это должно быть какая-то ошибка. Установка поля в NOW() не должна влиять на возвращаемый идентификатор. - person quano; 15.09.2011