2010-12-13 7 views

Répondre

0

Vous ne pouvez pas le faire avec une seule instruction SQL dans MySQL. Si MySQL prenait en charge les séquences de style Oracle, vous seriez en mesure de le faire dans une seule instruction. Mais parce que auto_increment ne vous donnera pas l'ID suivant jusqu'à après l'insertion a eu lieu, vous devez réellement avoir la ligne insérée avant d'avoir accès à l'ID. Le plus proche, vous pouvez obtenir MySQL est la suivante:

insert into imgae (image) values (null); 
update imgae set image=concat(last_insert_id(), '.jpg') where id=last_insert_id(); 

BTW: Je vois votre table est appelée imgae qui est probablement une faute de frappe. Vouliez-vous dire image? En outre, lorsque j'ai essayé d'exécuter votre instruction create table, il a échoué. J'ai dû faire quelques changements pour le faire fonctionner afin que je puisse valider ma réponse. Il devrait ressembler à ceci:

create table imgae(id int auto_increment primary key, image text); 
+0

Oui, c'est une faute de frappe. Merci pour votre réponse. En fait, j'utilise le fichier sfWidgetFormInputFileEditable de Symfony, qui semble devoir déterminer le nom de l'image avant l'exécution du sql d'insertion. Il est difficile d'avoir le nom de l'image avec une valeur Pk auto-incrémentée. – xdazzyy

+0

@xdazzyy: Je comprends qu'il est pratique d'avoir le pk dans le nom de fichier, et c'est certainement possible de le faire. Mais à l'OMI, ça ne vaut pas la complexité supplémentaire que vous aurez à ajouter pour le faire fonctionner. Sûrement c'est une exigence agréable et pas difficile. Est-ce? – Asaph

+0

Merci, Asaph. Mais, malheureusement, c'est une exigence difficile ... – xdazzyy

0

INSERT INTO "de imgae" ("image") (CONCAT (LAST ("id") + 1,/* Code de script pour aller chercher l'extension /))

+0

Je pense que vous avez mal compris la question. Il veut une ligne dans la table où la colonne 'image' a la clé primaire générée automatiquement dans le cadre de la valeur de la colonne (suivi de' .gif' ou '.jpg'). C'est un peu un problème de poule et d'œuf. – Asaph

+0

Merci Asaph, j'ai trouvé que le type d'image est "texte" puis corrigé. –

+0

Ceci a la même faille de sécurité de thread que la réponse de @Brian H. – Asaph

0
INSERT INTO imgae (image) VALUES (CONCAT(LAST_INSERT_ID() + 1, ".jpg")); 

Mais, cela ne nomme pas réellement le fichier image. Vous devrez vous assurer que vous le faites après l'exécution de mysql_inser_id() pour obtenir cette valeur.

+0

Ce n'est pas sécurisé. Vous courez le risque de collisions si plusieurs threads l'exécutent simultanément, ce qui peut facilement se produire dans une application Web. En outre, 'LAST_INSERT_ID()' est par connexion, cela ne fonctionnerait que si toutes les insertions se produisent sur la même connexion de base de données et que cette connexion n'est jamais fermée. Dès que vous rouvrez une nouvelle connexion, 'LAST_INSERT_ID()' retournera 'null'. – Asaph

+0

Merci d'avoir signalé cela, Asaph. –

0

Il semble redondant de stocker l'ID dans une colonne lorsque l'ID est déjà dans une autre colonne. Pourquoi ne pas garder le même id, et juste vous soucier de stocker l'extension de fichier? (En supposant que {id}.{jpg|gif} est tout ce qui se passe dans la colonne, et a été grossièrement déformé comme un type text). Puis interrogez-les et concattez l'identifiant et les colonnes d'extension pour obtenir un résultat.

... ou il me manque quelque chose

Questions connexes