it-roy-ru.com

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

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

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

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

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

182
Amy Neville

Вам необходимо использовать функцию 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 последней строки, вставленной you:

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

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

241
Duncan Lock

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

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

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

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

18
Martin Sansone - MiOEE

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

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

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

15
Explosion Pills

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

select LAST_INSERT_ID()

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

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

Для получения более подробной информации, пожалуйста, перейдите по ссылке эквивалент функции SQLServer SCOPE_IDENTITY () в MySQL?

13
PVR

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

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

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

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

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

(NodeJS-mySql)

2
MESepehr

Если вы используете PHP: В объекте PDO вы можете просто вызвать метод lastInsertId после вставки.

В противном случае с LAST_INSERT_ID вы можете получить значение, подобное этому: SELECT LAST_INSERT_ID();

0
Olafnyr

Лучший способ решить проблему IMHO - позволить вашему коду генерировать случайный uuid, а затем использовать этот uuid в качестве идентификатора первичного ключа для запроса INSERT. В этот момент ваш код уже знает «последний вставленный идентификатор», который является вашим uuid, и вы можете использовать его в других запросах MySQL. Идентификатор гарантированно будет уникальным, поэтому у вас не будет коллизий. Обязательно создайте первичный индекс для ваших столбцов uuid

0
Gianluca Ghettini

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

0
Arnav Singh

Если в python используется pymysql, из курсора вы можете использовать cursor.lastrowid

0
mojoken