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

При использовании 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)!!

Есть идеи?

1 Ответ

1 голос
/ 14 сентября 2011

Из руководства 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 игнорируется при использовании ОБНОВЛЕНИЕ КЛЮЧЕВЫХ КЛЮЧЕЙ.

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

...