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

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

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

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

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

187
14 июня '13 в 19:10
источник поделиться
11 ответов

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

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

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

18
07 авг. '14 в 0:56
источник

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

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

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

15
14 июня '13 в 19:27
источник

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

select LAST_INSERT_ID()

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

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

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

13
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
27 окт. '16 в 12:42
источник

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

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

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

(NodeJS-MySql)

2
31 мая '18 в 5:21
источник

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

0
04 апр. '19 в 0:30
источник

Я стал скрытным подписчиком, чтобы проголосовать за последний комментарий. Хотя мне не хватает "репутации", я чуть не сдал ее за голос -1, но что не так с ответом на вопрос из разных способов вызова mysql. Отличный ответ.

0
06 февр. '19 в 4:49
источник

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

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

0
19 янв. '19 в 2:48
источник

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

0
15 июля '18 в 12:38
источник

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

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

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

-6
13 февр. '16 в 19:54
источник

Посмотрите другие вопросы по меткам или Задайте вопрос