MySQL на дубликат ключа-последний идентификатор вставки?
У меня есть следующий запрос:
INSERT INTO table (a) VALUES (0)
ON DUPLICATE KEY UPDATE a=1
Мне нужен идентификатор либо вставки, либо обновления. Обычно я запускаю второй запрос, чтобы получить это, поскольку я считаю, что insert_id() возвращает только "вставленный" идентификатор, а не обновленный идентификатор.
есть ли способ вставить / обновить и получить идентификатор строки без выполнения двух запросов?
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