У меня есть следующий запрос:
INSERT INTO table (a) VALUES (0)
ON DUPLICATE KEY UPDATE a=1
Мне нужен идентификатор вставки или обновления. Обычно я запускаю второй запрос, чтобы получить это, поскольку считаю, что insert_id () возвращает только «вставленный» идентификатор, а не обновленный идентификатор.
Есть ли способ INSERT / UPDATE и получить идентификатор строки без выполнения двух запросов?
alter table tablename AUTO_INCREMENT = 0;
после вышеуказанного запроса, чтобы избежать больших пробелов в значениях идентификаторов.Ответы:
Проверьте эту страницу: https://web.archive.org/web/20150329004325/https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Внизу страницы они объясняют, как можно сделать LAST_INSERT_ID значимым для обновлений, передав выражение этой функции MySQL.
Из примера документации MySQL:
источник
Если быть точным, если это исходный запрос:
а id - это первичный ключ с автоинкрементом, чем это было бы рабочее решение:
Все здесь: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
источник
Вы можете посмотреть REPLACE, который по сути является удалением / вставкой, если запись существует. Но это изменит поле автоматического увеличения, если оно есть, что может нарушить отношения с другими данными.
источник
Я не знаю, какая у вас версия 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
источник
Я столкнулся с проблемой, когда ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID (id) увеличивает первичный ключ на 1. Таким образом, идентификатор следующего ввода в сеансе будет увеличен на 2
источник
Стоит отметить, и это может быть очевидно (но я все равно скажу это для ясности здесь), что REPLACE удалит существующую совпадающую строку перед вставкой ваших новых данных. ON DUPLICATE KEY UPDATE обновит только указанные вами столбцы и сохранит строку.
Из руководства :
источник
Существующие решения работают, если вы используете автоинкремент. У меня есть ситуация, когда пользователь может определить префикс, и он должен перезапустить последовательность с 3000. Из-за этого разнообразного префикса я не могу использовать автоинкремент, который делает last_insert_id пустым для вставок. Я решил это следующим образом:
Если префикс существует, он будет увеличивать его и заполнять last_insert_id. Если префикс не существует, он вставит префикс со значением 3000 и заполнит last_insert_id значением 3000.
источник