2009-10-28 3 views
7

sto cercando di qualche cosa del genere:MySQL: utilizzare l'id della riga di essere inserito nella dichiarazione dell'inserto stesso

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

picture_id è la mia chiave primaria, di incremento automatico. Fondamentalmente sto provando a inserire l'id di questa istruzione di inserimento, nell'istruzione stessa.

Sono sicuro che può essere fatto con qualche codice PHP aggiuntivo o usando più di una dichiarazione, ma mi chiedevo se c'è un modo semplice e veloce per farlo in un colpo solo.

PS. L'istruzione sopra riportata riporta sempre "0-test"

risposta

10

Inserire prima un record. Quindi separare le affermazioni con un punto e virgola e utilizzare LAST_INSERT_ID() per recuperare l'ID autoincrement appena inserito. Esegui in una volta.

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

Questo potrebbe causare una condizione di competizione ... attenzione –

+7

Come potrebbe? last_insert_id() dovrebbe essere specifico della connessione. Per citare il manuale: "Usare le colonne LAST_INSERT_ID() e AUTO_INCREMENT contemporaneamente da più client è perfettamente valido. Ogni cliente riceverà l'ultimo ID inserito per l'ultima istruzione eseguita dal client. ' – ChristopheD

+1

abbastanza giusto. il mio errore –

0

Beh, non si arriva a conoscere la riga id fino a quando l'inserto ha completato ... così, non credo che sia mai andare a lavorare!

Perché non calcolare il nome file quando si recupera la riga?

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

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

Questo non è davvero possibile, probabilmente sarebbe nel vostro interesse per concatinate semplicemente sulla via d'uscita, invece del modo in.

SELEZIONA CONCAT (id, '-text') come nome del file FROM dir_pictures

0

Se davvero si vuole farlo in un'istruzione SQL, si potrebbe provare un hack simile:

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

Attenzione alle condizioni di gara, se si tratta di un'applicazione multi-threaded ...

Inoltre, dubito che sarebbe lavorare su un tavolo vuoto ...

+0

Penso che se una riga è stata cancellata prima, questo non sarà accurato –

+0

Sì, grazie, buona cattura. Se la _ultima riga aggiunta di recente è stata eliminata, ciò fallirebbe. – violoncello

3

Basta selezionare il valore AUTO_INCREMENT corrente per il tabella form the information_schema come parte del tuo inserto:

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

Sì, questo sarebbe il modo di farlo in una dichiarazione ... ma non è davvero una buona idea. Farei sicuramente un inserto, quindi aggiorno. – Eli

+0

È brutto e c'è una piccola condizione di competizione tra il completamento della selezione interna e l'esecuzione dell'inserto. – Eli