2009-10-28 4 views
7

Ich bin einiger so etwas versuchen:MySQL: Verwenden Sie die ID der Zeile wird in der Insert-Anweisung selbst eingefügt

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

picture_id ist mein Primärschlüssel, Auto-Inkrement. Im Grunde versuche ich, die ID dieser insert-Anweisung in die Anweisung selbst zu schreiben.

Ich bin mir sicher, dass es mit etwas mehr PHP-Code oder mit mehr als nur Anweisungen getan werden kann, aber ich frage mich, ob es eine schnelle und einfache Möglichkeit gibt, es in einem Schuss zu tun.

PS. Die obige Aussage setzt immer '0-Test'

Antwort

10

Legen Sie zuerst einen Datensatz ein. Trennen Sie dann Ihre Anweisungen mit einem Semikolon und verwenden Sie LAST_INSERT_ID(), um die neu eingefügte Autoinkrement-ID abzurufen. Auf einmal ausführen.

 
insert into dir_pictures .... ; 
update dir_pictures set filename=CONCAT(LAST_INSERT_ID(),'-test') where id = LAST_INSERT_ID() 
+0

Dieses eine race Condition verursachen könnte ... watch out –

+7

wie könnte es? last_insert_id() soll verbindungsspezifisch sein. Um das Handbuch zu zitieren: 'Die Verwendung der Spalten LAST_INSERT_ID() und AUTO_INCREMENT gleichzeitig von mehreren Clients ist absolut gültig. Jeder Client erhält die letzte eingefügte ID für die letzte Anweisung, die der Client ausgeführt hat. " – ChristopheD

+1

fair genug. mein Fehler –

0

Nun, Sie nicht bekommen, die Zeilen-ID wissen, bis der Einsatz abgeschlossen ist ... ja, ich glaube nicht, dass jemals funktionieren wird!

Warum nicht einfach den Dateinamen berechnen, wenn Sie die Zeile stattdessen abrufen?

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

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

Dies ist nicht wirklich möglich, ist es wahrscheinlich in Ihrem besten Interesse sein würde einfach aus auf dem Weg concatinate anstelle die Art und Weise.

SELECT CONCAT (id, '-Text') als Dateinamen von dir_pictures

0

Wenn Sie es wirklich in einer SQL-Anweisung tun möchten, können Sie einen Hack wie versuchen:

INSERT INTO dir_pictures SET filename=CONCAT((select max(picture_id)+1 from dir_pictures),'-test');

Vorsicht Bedingungen der Rasse, wenn dies ein Multi-Threaded-App ist ...

Auch bezweifle ich, es auf einen leeren Tisch arbeiten würde ...

+0

Ich denke, wenn eine Zeile zuvor gelöscht wurde, wird dies nicht genau –

+0

Ja, danke, guten Fang. Wenn die _most recently_ addierte Zeile gelöscht wurde, würde dies fehlschlagen. – violoncello

3

Wählen Sie einfach den aktuellen auto_increment Wert für die Tabelle der information_schema als Teil Ihres Einsatzes bilden:

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

Yup, das wäre der Weg, es in einer Aussage zu tun ... aber es ist wirklich keine gute Idee. Ich würde definitiv eine Beilage machen, dann aktualisieren. – Eli

+0

Es ist hässlich und es gibt eine kleine Wettlaufsituation zwischen dem Abschluss der inneren Auswahl und dem Ausführen des Einsatzes. – Eli

Verwandte Themen