Получить новый идентификатор первичного ключа записи из запроса вставки mysql?

Итак, давайте скажем, что я делаю mysql INSERT в одной из моих таблиц, а таблица имеет столбец item_id, который установлен в autoincrement и primary key.

Как получить запрос для вывода значения вновь созданного первичного ключа item_id в том же запросе?

В настоящее время я запускаю второй запрос для извлечения идентификатора, но это вряд ли кажется хорошей практикой, поскольку это может привести к неправильному результату...

Если это невозможно, то какова наилучшая практика для получения правильного идентификатора?

160
задан Amy Neville 14 июня '13 в 19:10
источник поделиться
8 ответов

Вам нужно использовать функцию 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 этого клиента.

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

215
ответ дан Duncan Lock 14 июня '13 в 19:16
источник поделиться

ОСТОРОЖНО! из "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 07 авг. '14 в 0:56
источник поделиться

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

select LAST_INSERT_ID()

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

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

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

13
ответ дан PVR 14 июня '13 в 19:27
источник поделиться

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

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

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

13
ответ дан Explosion Pills 14 июня '13 в 19:27
источник поделиться

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

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 27 окт. '16 в 12:42
источник поделиться

Эти параметры будут получены в результате вашего запроса:

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

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

(NodeJS-MySql)

1
ответ дан MESepehr 31 мая '18 в 5:21
источник поделиться

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

0
ответ дан Arnav Singh 15 июля '18 в 12:38
источник поделиться

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

--- INSERT STATEMENT GOES HERE --- SELECT id FROM table ORDER BY id DESC LIMIT 1;

Это должно вернуть наибольший идентификатор в таблице, таким образом, последний идентификатор вставлен

-6
ответ дан Pizza Scripters 13 февр. '16 в 19:54
источник поделиться

Другие вопросы по меткам