Получить идентификатор последней обновленной записи в MySQL [duplicate]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

Это простой синхронный вызов функции (где каждая строка кода выполняется одна за другой в последовательность), и результат будет таким же, как ожидалось.

Теперь добавим немного завихрения, введя небольшую задержку в нашей функции, чтобы все строки кода не выполнялись последовательно. Таким образом, он будет эмулировать асинхронное поведение функции:

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

Таким образом, резюме - для решения асинхронных функций, таких как вызовы на основе ajax и т. д., вы можете использовать обещание resolve значение (которое вы намерены вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.

160
задан Amy Neville 14 June 2013 в 17:10
поделиться

7 ответов

Вам нужно использовать функцию LAST_INSERT_ID(): http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

Например:

INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();

Это вернет вам значение PRIMARY KEY последней строки, которое вы вставили :

Идентификатор, который был сгенерирован, поддерживается на сервере на основе для каждого соединения . Это означает, что значение, возвращаемое функцией для данного клиента, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющим на столбец AUTO_INCREMENT этого клиента .

So на него не влияют другие запросы, которые могут выполняться на сервере у других пользователей.

214
ответ дан Duncan Lock 5 September 2018 в 10:39
поделиться

просто используйте «$ last_id = mysqli_insert_id ($ conn);»

0
ответ дан Arnav Singh 5 September 2018 в 10:39
поделиться

Вот что вы ищете !!!

select LAST_INSERT_ID()

Это лучшая альтернатива функции SCOPE_IDENTITY(), используемой в SQL Server.

Вам также нужно имейте в виду, что это будет работать, только если Last_INSERT_ID() запущен после вашего запроса Insert. Это запрос возвращает идентификатор, вставленный в схему. Вы не можете получить последний вставленный идентификатор конкретной таблицы.

Для получения дополнительной информации перейдите по ссылке Эквивалент функции SQLServer SCOPE_IDENTITY () в mySQL?

13
ответ дан Community 5 September 2018 в 10:39
поделиться

Из документации LAST_INSERT_ID():

Идентификатор, который был сгенерирован, поддерживается на сервере на основе для каждого соединения

То есть, если у вас есть два отдельных запроса к скрипту одновременно, они не будут влиять друг на друга LAST_INSERT_ID() (если вы не используете постоянное соединение, возможно).

13
ответ дан Explosion Pills 5 September 2018 в 10:39
поделиться

Вы получите эти параметры в результатах запроса:

    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 66,
    "serverStatus": 2,
    "warningCount": 1,
    "message": "",
    "protocol41": true,
    "changedRows": 0

insertId - это именно то, что вам нужно.

(NodeJS-mySql)

1
ответ дан marc_s 5 September 2018 в 10:39
поделиться

ОСТОРОЖНО! из "LAST_INSERT_ID ()", если вы пытаетесь вернуть это значение первичного ключа в PHP.

Я знаю, что этот поток не помечен php, но для любого, кто столкнулся с этим ответом, который хочет вернуть идентификатор вставки MySQL из PHP-скриптовая вставка с использованием стандартных вызовов mysql_query - она ​​не работает и не очевидна без захвата SQL-ошибок.

Новейшая mysqli поддерживает несколько запросов - LAST_INSERT_ID () на самом деле является вторым запросом от оригинала.

IMO отдельный SELECT для определения последнего первичного ключа безопаснее, чем функция mysql_insert_id (), возвращающая идентификатор AUTO_INCREMENT, сгенерированный из предыдущей операции INSERT.

15
ответ дан Martin Sansone - MiOEE 5 September 2018 в 10:39
поделиться

Если вам нужно значение перед вставкой строки:

CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
    RETURNS BIGINT
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN

    DECLARE Value BIGINT;

    SELECT
        AUTO_INCREMENT INTO Value
    FROM
        information_schema.tables
    WHERE
        table_name = TableName AND
        table_schema = DATABASE();

    RETURN Value;

END

Вы можете использовать это в вставке:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( concat (convert ( now() , char), ' ',   getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);
6
ответ дан Paulo A. Costa 5 September 2018 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: