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

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

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

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

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

Ответ 1

Вам необходимо использовать функцию 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() каждого пользователя и не зависит от других запросов, которые могут выполняться на сервере от других пользователей.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

select LAST_INSERT_ID()

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

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

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

Ответ 5

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

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

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

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

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

(NodeJS-MySql)

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

я использовал return $this->db->insert_id(); для Codeigniter

Ответ 13

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

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

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