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


Как получить идентификатор последней обновленной строки в MySQL с помощью PHP?

12 116

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. Это работает только в том случае, если какая-то строка была фактически найдена, поэтому не забудьте проверить затронутые строки. Затем вы можете получить идентификатор несколькими способами.

MySQL last_insert_id()

вы можете генерировать последовательности без вызова LAST_INSERT_ID(), но полезность использования функции таким образом заключается в том, что значение ID сохраняется на сервере, как последнее автоматически сгенерированное значение. Оно мульти-пользователя Safe потому что несколько клиентов могут выпустить обновление оператор и получить свое собственное значение последовательности с помощью инструкции SELECT (или mysql_insert_id ()), не затрагивая и не будучи затронутым другими клиенты, которые генерируют свои собственные значения последовательности.

MySQL 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.

PHP mysqli_insert_id()

выполнение инструкции 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 (не знаю, почему)... или я не могу получить контент @жидкостями (это был большой двоичный объект) Кстати большое спасибо за Помык ответ!

мое решение состоит в том, чтобы сначала решить "id" ( @uids ) с помощью команды select и после обновления этого идентификатора с помощью @uids .

SET @uids := (SELECT id FROM table WHERE some = 0 LIMIT 1);
UPDATE table SET col = 1 WHERE id = @uids;SELECT @uids;

он работал над моим проектом.

нет необходимости так долго код Mysql. В PHP, запрос должен выглядеть примерно так:

$updateQuery = mysql_query("UPDATE table_name SET row='value' WHERE id='$id'") or die ('Error');
$lastUpdatedId = mysql_insert_id();