web-dev-qa-db-fra.com

Obtenir le nouvel ID de clé primaire d'enregistrement à partir de la requête d'insertion mysql

Ok, alors disons que je fais un mysql INSERT dans l'une de mes tables et que la table a la colonne item_id qui est définie sur autoincrement et primary key.

Comment faire en sorte que la requête génère la valeur de la clé primaire nouvellement générée item_id dans la même requête?

Actuellement, je lance une seconde requête pour récupérer l'identifiant, mais cela ne semble pas être une bonne pratique, car cela pourrait produire un résultat erroné ...

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

182
Amy Neville

Vous devez utiliser la fonction LAST_INSERT_ID(): http://dev.mysql.com/doc/refman/5.0/fr/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 avez insérée:

L'ID généré est conservé sur le serveur par connexion. Cela signifie que la valeur renvoyée par la fonction à un client donné est la première valeur AUTO_INCREMENT générée pour l'instruction la plus récente affectant une colonne AUTO_INCREMENT par ce client.

Ainsi, la valeur renvoyée par LAST_INSERT_ID() est par utilisateur et non affectée par d'autres requêtes susceptibles de s'exécuter sur le serveur d'autres utilisateurs.

241
Duncan Lock

IL FAUT SE MÉFIER !! of "LAST_INSERT_ID ()" si vous essayez de renvoyer cette valeur de clé primaire dans PHP.

Je sais que ce fil n'est pas étiqueté php, mais pour tous ceux qui sont tombés sur cette réponse cherchant à renvoyer un ID d'insertion MySQL à partir d'une insertion scriptée PHP à l'aide d'appels standard mysql_query - cela ne fonctionnera pas et ne sera pas évident sans capturer des erreurs SQL.

Le plus récent mysqli supporte plusieurs requêtes -/ LAST_INSERT_ID () est en fait une seconde requête de l'originale.

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

18

De la documentation LAST_INSERT_ID():

L'identifiant généré est conservé sur le serveur par connexion.

C'est-à-dire que si vous avez deux demandes distinctes au script simultanément, elles n'affecteront pas la fonction LAST_INSERT_ID() (à moins que vous n'utilisiez peut-être une connexion persistante).

15
Explosion Pills

Voici ce que vous cherchez !!!

select LAST_INSERT_ID()

C'est la meilleure alternative à 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 déclenché à la suite de votre requête Insert . Cette requête renvoie l'identifiant inséré dans le schéma. Vous ne pouvez pas obtenir le dernier identifiant inséré dans une table spécifique. 

Pour plus de détails, veuillez cliquer sur le lien L'équivalent de la fonction SQLServer SCOPE_IDENTITY () dans mySQL?

13
PVR

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 utiliser ceci dans un insert:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( concat (convert ( now() , char), ' ',   getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);
6
Paulo A. Costa

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

La insertId est exactement ce dont vous avez besoin.

(NodeJS-mySql)

2
MESepehr

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

1
Arnav Singh

Si vous utilisez PHP: Sur un objet PDO vous pouvez simplement appeler la méthode lastInsertId après votre insertion.

Sinon, avec LAST_INSERT_ID vous pouvez obtenir la valeur suivante: SELECT LAST_INSERT_ID();

0
Olafnyr

Le meilleur moyen de résoudre le problème à mon humble avis est de laisser votre code générer une uuid aléatoire, puis d’utiliser cette uuid comme id de clé primaire pour votre requête INSERT. À ce stade, votre code connaît déjà le "dernier identifiant inséré", qui est votre uuid, et vous pouvez le réutiliser pour d’autres requêtes MySQL. L'identifiant est garanti d'être unique afin d'éviter les collisions. Assurez-vous de créer un index primaire pour vos colonnes uuid

0

Si vous utilisez pymysql en python, vous pouvez utiliser cursor.lastrowid depuis le curseur

0
mojoken

j'ai utilisé return $this->db->insert_id(); pour Codeigniter

0
Hamza Saeed