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?
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.
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.
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).
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?
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'
);
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)
utilisez simplement "$ last_id = mysqli_insert_id ($ conn);"
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();
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
Si vous utilisez pymysql en python, vous pouvez utiliser cursor.lastrowid depuis le curseur
j'ai utilisé return $this->db->insert_id();
pour Codeigniter