2011-09-21 19 views
35

sto inserendo alcune parole in una tabella a due colonne con questo comando:Come posso ottenere l'ID di più righe inserite in MySQL?

INSERT IGNORE INTO terms (term) VALUES ('word1'), ('word2'), ('word3'); 
  1. Come posso ottenere l'ID (chiave primaria) della riga in cui è inserito ogni parola. Intendo restituire un valore come "55,56,57" dopo aver eseguito INSERT. MySQL ha una tale risposta?

  2. La colonna termine è UNIQUE. Se esiste già un termine, MySQL non lo inserirà. È possibile restituire il riferimento per questa duplicazione (cioè l'ID della riga in cui esiste il termine)? Una risposta come "55, , 56".

risposta

35
  1. Si arriva via SELECT LAST_INSERT_ID(); o attraverso avere il quadro/libreria MySQL (in qualsiasi lingua) chiamare mysql_insert_id().

  2. che non funzionano. Qui è necessario interrogare gli ID dopo l'inserimento.

+5

1. Ciò non funzionerà per un inserto a più file come mostra l'OP. – ceejayoz

+0

+1 per la risposta corretta. : D – brenjt

+2

A destra - non in uno con 'INSERT IGNORE'. Ma in un non-'IGNORE', ti dà il primo valore generato e inserito. – glglgl

3

Perché non basta:

SELECT ID 
    FROM terms 
WHERE term IN ('word1', 'word2', 'word3') 
+0

che sarebbe recuperare termini che sono stati inseriti in precedenza, e che sarebbe vulnerabile ad una condizione di competizione in cui qualcos'altro inserisce record prima che i fuochi di selezione della query. – ceejayoz

+2

?? il termine ha una condizione UNICA. L'unica cosa che potrebbe influenzare il SELEZIONA in una condizione di competizione è un DELETE, non un altro INSERT. E secondo (2) nel post di OP, vogliono che gli ID dei record precedentemente inseriti siano inclusi. – mellamokb

+0

Questo è quello che avevo in mente; ma ha bisogno di poche righe di codice. A prescindere da SELECT, ho bisogno di recuperare i risultati e metterli in un ciclo while (in php che uso). Spero di trovare qualche tipo di risposta mysql. – Googlebot

1

In primo luogo, per ottenere l'id appena inserito, si può fare qualcosa di simile:

SELECT LAST_INSERT_ID() ; 

cura, questo funziona solo dopo l'ultima INSERT query e verrà restituito il primo ID solo se hai un inserto multiplo!

Poi, con l'opzione IGNORE, non credo che sia possibile ottenere le linee che non sono stati inseriti. Quando si crea un valore INSERT IGNORE, basta dire a MySQL di ignorare le righe che dovrebbero creare una voce duplicata.

Se non si inserisce questa opzione, INSERT verrà arrestato e si avrà la linea interessata dalla duplicazione.

+0

Anche senza IGNORE, funziona solo per INSERT a riga singola. Il mio comando è un multi-row INSERT – Googlebot

+0

Solo la prima parte della mia risposta era includere IGNORE. –

+1

Se si utilizza PHP, è possibile memorizzare gli ID in una tabella utilizzando un ciclo con un singolo INSERT in ogni passaggio. –

Problemi correlati