Как получить идентификатор последней обновленной строки в MySQL?
Как получить идентификатор последней обновленной строки в MySQL с помощью PHP?
12 ответов:
Я нашел ответ на этот проблема :)
SET @update_id := 0; UPDATE some_table SET column_name = 'value', id = (SELECT @update_id := id) WHERE some_other_column = 'blah' LIMIT 1; SELECT @update_id;
EDIT by aefxx
этот метод может быть дополнительно расширен для получения идентификатора каждой строки, на которую влияет оператор update:
SET @uids := null; UPDATE footable SET foo = 'bar' WHERE fooid > 5 AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) ); SELECT @uids;
это вернет строку со всеми идентификаторами, объединенными запятой.
Хм, я удивлен, что среди ответов я не вижу самого простого решения.
предположим,
item_id
- это целочисленный столбец идентификаторов вitems
таблица и вы обновляете строки с помощью следующего оператора:UPDATE items SET qwe = 'qwe' WHERE asd = 'asd';
затем, чтобы узнать последнюю затронутую строку сразу после оператора, вы должны немного обновить оператор следующим образом:
UPDATE items SET qwe = 'qwe', item_id=LAST_INSERT_ID(item_id) WHERE asd = 'asd'; SELECT LAST_INSERT_ID();
Если вам нужно обновить только действительно измененную строку, вам нужно будет добавить условное обновление item_id через LAST_INSERT_ID проверяет, будут ли данные меняться в строке.
Это тот же метод, что и ответ Салмана А, но вот код, который вам действительно нужно сделать.
во-первых, отредактируйте таблицу так, чтобы она автоматически отслеживала каждый раз, когда строка изменяется. Удалите последнюю строку, если вы хотите только знать, когда строка была первоначально вставлена.
ALTER TABLE mytable ADD lastmodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
затем, чтобы узнать последние обновленную строку, вы можете использовать этот код.
SELECT id FROM mytable ORDER BY lastmodified DESC LIMIT 1;
этот код все снято с MySQL vs PostgreSQL: добавление ' последнего изменения Время ' столбец в таблицу и MySQL Руководство: Сортировка Строк. Я только что собрал его.
это официально просто, но удивительно противоречиво. Если вы делаете:
update users set status = 'processing' where status = 'pending' limit 1
измените его на это:
update users set status = 'processing' where status = 'pending' and last_insert_id(user_id) limit 1
дополнение
last_insert_id(user_id)
наwhere
предложение говорит MySQL to set его внутренняя переменная к идентификатору найденной строки. Когда вы передаете значениеlast_insert_id(expr)
таким образом, он возвращает это значение, которое в случае идентификаторов, подобных here, всегда является положительным целым числом и поэтому всегда возвращает значение true, никогда не вмешиваясь в предложении where. Это работает только в том случае, если какая-то строка была фактически найдена, поэтому не забудьте проверить затронутые строки. Затем вы можете получить идентификатор несколькими способами.вы можете генерировать последовательности без вызова LAST_INSERT_ID(), но полезность использования функции таким образом заключается в том, что значение ID сохраняется на сервере, как последнее автоматически сгенерированное значение. Оно мульти-пользователя Safe потому что несколько клиентов могут выпустить обновление оператор и получить свое собственное значение последовательности с помощью инструкции SELECT (или mysql_insert_id ()), не затрагивая и не будучи затронутым другими клиенты, которые генерируют свои собственные значения последовательности.
возвращает значение, сгенерированное для столбца AUTO_INCREMENT предыдущая инструкция INSERT или UPDATE. Используйте эту функцию после того, как вы выполняются инструкции Insert в таблицу, содержащую AUTO_INCREMENT поле, или использовали INSERT или UPDATE для установки столбца значение с LAST_INSERT_ID (expr).
причина различий между LAST_INSERT_ID() и mysql_insert_id () - это то, что LAST_INSERT_ID () прост в использовании скрипты в то время как mysql_insert_id () пытается предоставить более точные информация о том, что происходит со столбцом AUTO_INCREMENT.
выполнение инструкции INSERT или UPDATE с помощью LAST_INSERT_ID() функция будет также изменить значение, возвращаемое функция mysqli_insert_id() функция.
складывая все это вместе:
$affected_rows = DB::getAffectedRows(" update users set status = 'processing' where status = 'pending' and last_insert_id(user_id) limit 1" ); if ($affected_rows) { $user_id = DB::getInsertId(); }
(FYI, что класс DB здесь.)
запрос :
$sqlQuery = "UPDATE update_table SET set_name = 'value' WHERE where_name = 'name' LIMIT 1;";
функция PHP:
function updateAndGetId($sqlQuery) { mysql_query(str_replace("SET", "SET id = LAST_INSERT_ID(id),", $sqlQuery)); return mysql_insert_id(); }
это работа для меня;)
Эй, мне просто нужен был такой трюк - я решил его по-другому, может быть, это сработает для вас. Обратите внимание, это не масштабируемое решение и будет очень плохо для больших наборов данных.
разделить запрос на две части -
во-первых, выберите идентификаторы строк, которые вы хотите обновить и сохранить их во временной таблице.
во-вторых, сделайте исходное обновление с условием в инструкции update измененным на
where id in temp_table
.и обеспечить параллелизм, вам нужно замок в таблице перед этим два шага, а затем отпустите замок в конце.
опять же, это работает для меня, для запроса, который заканчивается
limit 1
, поэтому я даже не использую временную таблицу, а вместо этого просто переменную для хранения результата первогоselect
.Я предпочитаю этот метод, так как я знаю, что всегда буду обновлять только одну строку, и код прост.
идентификатор последней обновленной строки - это тот же идентификатор, который вы используете в "updateQuery", чтобы найти и обновить эту строку. Итак, просто сохраните (позвоните) этот идентификатор в любом случае.
last_insert_id()
зависит отAUTO_INCREMENT
, но последнее обновление не.
далее больше к выше принятому ответу
для тех, кто задавался вопросом о:=
&=
существенная разница между
:=
и=
и:=
работает как оператор присваивания переменной везде, в то время как=
работает только таким образом в операторах SET и является оператором сравнения везде.так
SELECT @var = 1 + 1;
уйдет@var
без изменений и вернуть a boolean (1 или 0 в зависимости от текущего значения @var), в то время какSELECT @var := 1 + 1;
изменится@var
до 2 и возврат 2. [Источник]
Если вы делаете только вставки, и хотите один из той же сессии, сделать в соответствии с ответом peirix. Если вы делаете изменения, вам нужно будет изменить схему базы данных, чтобы сохранить, какая запись была обновлена в последний раз.
Если вы хотите идентификатор из последней модификации, которая, возможно, была из другого сеанса (т. е. не тот, который был только что выполнен PHP-кодом, работающим в настоящее время, но один, сделанный в ответ на другой запрос), вы можете добавить столбец TIMESTAMP в ваша таблица называется last_modified (см. http://dev.mysql.com/doc/refman/5.1/en/datetime.html для информации), а затем при обновлении установите last_modified=CURRENT_TIME.
установив это, вы можете использовать запрос: Выберите id из таблицы ORDER BY last_modified DESC LIMIT 1; чтобы получить самую последнюю измененную строку.
SET @uids := ""; UPDATE myf___ingtable SET id = id WHERE id < 5 AND ( SELECT @uids := CONCAT_WS(',', CAST(id AS CHAR CHARACTER SET utf8), @uids) ); SELECT @uids;
Я должен был бросить id (не знаю, почему)... или я не могу получить контент @жидкостями (это был большой двоичный объект) Кстати большое спасибо за Помык ответ!