8
votes

MySQL: Utilisez l'ID de la ligne étant insérée dans l'instruction insertion elle-même

J'essaie de quelque chose comme ça:

INSERT INTO dir_pictures SET filename=CONCAT(picture_id,'-test');


0 commentaires

5 Réponses :


10
votes

2 commentaires

Cela pourrait causer une condition de course ... Voir


Comment pourrait-il? last_insert_id () est censé être spécifique à la connexion. Pour citer le manuel: «Utiliser simultanément les colonnes de Last_Insert_ID (Id () et AUTO_INCREMENTE à partir de plusieurs clients est parfaitement valide. Chaque client recevra le dernier identifiant inséré pour la dernière instruction que le client a exécuté. '



0
votes

Eh bien, vous ne connaissez pas l'identifiant de la ligne jusqu'à ce que l'insert soit terminé ... Donc, je ne pense pas que cela ne fonctionne jamais!

Pourquoi ne pas simplement calculer le nom de fichier lorsque vous récupérez la ligne Au lieu de cela? P>

INSERT INTO dir_pictures (file_extension) VALUES ('-data')

SELECT picture_id, CONCAT(picture_id, file_extension) as filename
FROM dir_pictures


0 commentaires

0
votes

Ce n'est pas vraiment possible, ce serait probablement dans votre intérêt à conciser simplement sur le point de sortir au lieu de la manière de.

Sélectionnez Concat (ID, '-Text') en tant que nom de fichier de dir_pictures


0 commentaires

0
votes

Si vous voulez vraiment le faire dans une déclaration SQL, vous pouvez essayer un piratage comme:

Insérer dans Dir_Pictures Set FileName = Concat ((Sélectionnez max (image_id) +1 de dir_pictures), '- test');

méfiez-vous des conditions de course s'il s'agit d'une application multi-threadée ...

En outre, je doute que cela fonctionne sur une table vide ...


2 commentaires

Je pense que si une ligne a été supprimée avant, cela ne sera pas précis


Oui, merci, bonne prise. Si la ligne ajoutée la plus récemment a été supprimée, cela échouerait.



3
votes

Il suffit de sélectionner la valeur actuelle AUTO_INCREMENTE pour le formulaire de tableau. Le tableau Information_schema dans votre insertion:

INSERT INTO dir_pictures SET filename=CONCAT((SELECT auto_increment FROM
information_schema.tables WHERE table_name='dir_pictures'), '-test')


2 commentaires

Yup, ce serait la façon de le faire dans une déclaration ... mais ce n'est vraiment pas une bonne idée. Je ferais certainement un insertion, puis mettez à jour.


C'est moche et il y a une petite condition de race entre lorsque la sélection interne complète et l'insert fonctionne.