MySQL на дубликат ключа-последний идентификатор вставки?



У меня есть следующий запрос:



INSERT INTO table (a) VALUES (0)
ON DUPLICATE KEY UPDATE a=1


Мне нужен идентификатор либо вставки, либо обновления. Обычно я запускаю второй запрос, чтобы получить это, поскольку я считаю, что insert_id() возвращает только "вставленный" идентификатор, а не обновленный идентификатор.



есть ли способ вставить / обновить и получить идентификатор строки без выполнения двух запросов?

466   6  

6 ответов:

проверьте эту страницу:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
В нижней части страницы они объясняют, как вы можете сделать LAST_INSERT_ID значимым для обновлений, передав выражение этой функции MySQL.

из примера документации MySQL:

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

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

чтобы быть точным, если это исходный запрос:

INSERT INTO table (a) VALUES (0)
 ON DUPLICATE KEY UPDATE a=1

и " id " -это первичный ключ автоматического увеличения, чем это было бы рабочим решением:

INSERT INTO table (a) VALUES (0)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), a=1

все здесь:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Если таблица содержит столбец AUTO_INCREMENT и INSERT ... ОБНОВЛЕНИЕ вставляет строку, функция LAST_INSERT_ID () возвращает Значение AUTO_INCREMENT. Если оператор обновляет строку вместо, LAST_INSERT_ID() не имеет смысла. Тем не менее, вы можете обойти это с помощью LAST_INSERT_ID (expr). Предположим, что id-это AUTO_INCREMENT колонна.

вы можете посмотреть на REPLACE, который по существу является delete / insert, если запись существует. Но это изменит поле автоматического приращения, если оно присутствует, что может нарушить отношения с другими данными.

Я не знаю, что такое ваша версия MySQL, но с InnoDB, была ошибка с autoinc

ошибка в 5.1.20 и исправлена в 5.1.23 http://bugs.mysql.com/bug.php?id=27405

ошибка в 5.1.31 и исправлена в 5.1.33 http://bugs.mysql.com/bug.php?id=42714

стоит отметить, и это может быть очевидно (но я все равно скажу это для ясности здесь), что REPLACE сдует существующую соответствующую строку перед вставкой новых данных. При обновлении дубликата ключа будут обновлены только указанные столбцы и сохранена строка.

с руководство:

заменить работает точно так же, как вставить, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для a Первичный ключ или уникальный индекс, старое строка удаляется до появления новой строки вставленный.

существующие решения работают, если вы используете автоинкремент. У меня есть ситуация, когда пользователь может определить префикс, и он должен перезапустить последовательность на 3000. Из-за этого различного префикса я не могу использовать autoincrement, который делает last_insert_id пустым для вставок. Я решил ее следующим образом:

INSERT INTO seq_table (prefix, id) VALUES ('$user_prefix', LAST_INSERT_ID(3000)) ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id + 1);
SELECT LAST_INSERT_ID();

если префикс существует, он увеличит его и заполнит last_insert_id. Если префикс не существует, он вставит префикс со значением 3000 и заполнит last_insert_id с 3000.

Comments

    Ничего не найдено.