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?
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.
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.
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).
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?
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'
);
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)
utilisez simplement "$last_id = mysqli_insert_id ($conn); "