Obtener el nuevo ID de clave primaria de registro de mysql insertar consulta?


Ok, así que digamos que estoy haciendo un mysql INSERT en una de mis tablas y la tabla tiene la columna item_id que se establece en autoincrement y primary key.

¿Cómo consigo que la consulta genere el valor de la clave primaria recién generada item_id en la misma consulta?

Actualmente estoy ejecutando una segunda consulta para recuperar el id, pero esto no parece una buena práctica teniendo en cuenta que esto podría producir el resultado incorrecto...

Si esto no es posible, entonces ¿cuál es la mejor práctica para ¿me aseguro de recuperar el ID correcto?

Author: Amy Neville, 2013-06-14

7 answers

Necesitas usar la función LAST_INSERT_ID(): http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

Eg:

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

Esto te devolverá el PRIMARY KEY valor de la última fila que has insertado:

El ID generado se mantiene en el servidor de forma por conexión. Esto significa que el valor devuelto por la función a un cliente dado es el primer valor AUTO_INCREMENT generado para la mayoría declaración reciente que afecta a una columna AUTO_INCREMENT por ese cliente.

Así que esto no se ve afectado por otras consultas que podrían estar ejecutándose en el servidor desde otros usuarios.

 217
Author: Duncan Lock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-03 19:38:45

¡CUIDADO !! de "LAST_INSERT_ID ()" si se intenta devolver este valor de clave primaria dentro de PHP.

Sé que este hilo no está etiquetado php, pero para cualquiera que se encuentre con esta respuesta que busque devolver un id de inserción MySQL desde un insert con script PHP utilizando llamadas estándar de mysql_query, no funcionará y no es obvio sin capturar errores SQL.

El nuevo mysqli soporta múltiples consultas-que LAST_INSERT_ID () en realidad es una segunda consulta de la original.

IMO una SELECCIÓN separada para identificar la última clave primaria es más segura que la función opcional mysql_insert_id() que devuelve el ID AUTO_INCREMENT generado de la operación de INSERCIÓN anterior.

 15
Author: Martin Sansone - MiOEE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-06 21:56:47

De la documentación LAST_INSERT_ID():

El ID que se generó se mantiene en el servidor de forma por conexión

Es decir, si tiene dos solicitudes separadas al script simultáneamente, no afectarán a las LAST_INSERT_ID() de las demás (a menos que esté utilizando una conexión persistente tal vez).

 13
Author: Explosion Pills,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-14 16:27:23

Aquí lo que estás buscando !!!

select LAST_INSERT_ID()

Esta es la mejor alternativa de la función SCOPE_IDENTITY() que se utiliza en SQL Server.

También debe tener en cuenta que esto solo funcionará si Last_INSERT_ID() se activa después de su consulta Insert. Que es la consulta devuelve el id insertado en el esquema. No puede obtener el último id insertado de una tabla específica.

Para más detalles por favor vaya a través del enlace El equivalente de la función SQLServer SCOPE_IDENTITY() en MySQL?

 13
Author: PVR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:24

Si necesita el valor antes de insertar una fila:

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

Puede usar esto en una inserción:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( concat (convert ( now() , char), ' ',   getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);
 6
Author: Paulo A. Costa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 09:42:18

Recibirá estos parámetros en el resultado de su consulta:

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

El insertId es exactamente lo que necesitas.

(NodeJS-MySQL)

 1
Author: MESepehr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-31 04:58:42

Simplemente use "l last_id = mysqli_insert_id (con conn);"

 0
Author: Arnav Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-15 09:38:36