Obtenir le nouvel enregistrement ID de la clé primaire de mysql insert query?

Ok, donc disons que je fais un mysql INSERT dans une de mes tables et la table a la colonne item_id qui est réglée à autoincrement et primary key .

Comment puis-je obtenir la requête pour afficher la valeur de la clé primaire nouvellement générée item_id dans la même requête?

actuellement, je suis en train d'exécuter une seconde requête pour récupérer l'id mais cela ne semble pas être une bonne pratique considérant que cela pourrait produire le mauvais résultat...

si cela n'est pas possible, quelle est la meilleure pratique pour m'assurer de récupérer le bon id?

162
demandé sur Amy Neville 2013-06-14 20:10:37

7 réponses

vous devez utiliser la fonction LAST_INSERT_ID() : http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

par exemple:

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

cela vous permettra de récupérer la valeur PRIMARY KEY de la dernière ligne que vous inséré:

l'ID généré est maintenu dans le serveur sur la base de par connexion . Cela signifie que la valeur retournée par la fonction à un client donné est la première valeur D'AUTO_ incrément générée pour l'énoncé le plus récent affectant une colonne D'AUTO_ incrément par ce client .

donc ceci n'est pas affecté par d'autres requêtes qui pourraient être exécutées sur le serveur par d'autres utilisateurs.

217
répondu Duncan Lock 2014-03-03 19:38:45

attention !! de " LAST_INSERT_ID ()" si vous essayez de retourner cette valeur clé primaire dans PHP.

je sais que ce thread n'est pas tagged php, mais pour toute personne qui est tombée sur cette réponse cherchant à retourner un ID D'insertion MySQL à partir d'un insert PHP scripté en utilisant des appels mysql_query standard - cela ne fonctionne pas et n'est pas évident sans capturer des erreurs SQL.

le nouveau mysqli prend en charge les requêtes multiples - qui LAST_INSERT_ID () est en fait une seconde requête de l'original.

IMO un SELECT séparé pour identifier la dernière clé primaire est plus sûr que la fonction optionnelle mysql_insert_id() retournant L'ID AUTO_ increment généré à partir de L'opération précédente INSERT.

15
répondu Martin Sansone - MiOEE 2014-08-06 21:56:47

De la LAST_INSERT_ID() de la documentation:

l'ID généré est maintenu dans le serveur sur une base par connexion

C'est-à-dire que si vous avez deux requêtes distinctes au script simultanément elles n'affecteront pas l'une l'autre LAST_INSERT_ID() (sauf si vous utilisez une connexion persistante peut-être).

13
répondu Explosion Pills 2013-06-14 16:27:23

voilà ce que vous cherchez !!!

select LAST_INSERT_ID()

C'est la meilleure alternative de la fonction SCOPE_IDENTITY() utilisée dans SQL Server .

vous devez également garder à l'esprit que cela ne fonctionnera que si Last_INSERT_ID() est lancé suite à votre requête Insert . C'est la requête renvoie l'id inséré dans le schéma. Vous ne pouvez pas obtenir le dernier id inséré de la table spécifique.

pour plus de détails, veuillez consulter le lien l'équivalent de la fonction SQLServer SCOPE_IDENTITY () dans mySQL?

13
répondu PVR 2017-05-23 11:47:24

Si vous avez besoin de la valeur avant d'insérer une ligne:

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

Vous pouvez l'utiliser dans un insert:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( concat (convert ( now() , char), ' ',   getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);
6
répondu Paulo A. Costa 2016-10-27 09:42:18

vous recevrez ces paramètres sur le résultat de votre requête:

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

Le insertId est exactement ce dont vous avez besoin.

(NodeJS-mySql)

1
répondu MESepehr 2018-05-31 04:58:42

utilisez simplement "$last_id = mysqli_insert_id ($conn); "

0
répondu Arnav Singh 2018-07-15 09:38:36