2013-06-14 12 views
136

Ok, quindi diciamo che sto facendo un mysql INSERT in uno dei miei tavoli e la tabella ha la colonna item_id che è impostata su autoincrement e primary key.Ottieni il nuovo ID della chiave primaria del record da mysql insert query?

Come ottengo la query per emettere il valore della chiave primaria appena generata item_id nella stessa query?

Attualmente sto facendo funzionare una seconda query per recuperare l'ID, ma questo difficilmente sembra come buona pratica considerare questo potrebbe produrre il risultato sbagliato ...

Se questo non è possibile allora che cosa è la migliore pratica per garantire Recupero l'id corretto?

+1

Non c'è modo di restituire nulla da una query 'INSERT' come quella; perché pensi che potrebbe produrre il risultato sbagliato? –

+3

Bene, se il processo viene eseguito da 2 persone separatamente, allora si potrebbe ottenere una lista di processi sovrapposti, poiché si devono eseguire 2 query separate? –

+0

Possibile duplicato di [PHP/MySQL inserire riga quindi ottenere 'id'] (http://stackoverflow.com/questions/897356/php-mysql-insert-row-then-get-id) –

risposta

183

è necessario utilizzare la funzione LAST_INSERT_ID(): http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

Esempio:

INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...); 
SELECT LAST_INSERT_ID(); 

Questo ti porterà indietro il valore PRIMARY KEY dell'ultima riga che si inserito:

L'ID che è stato generato viene mantenuto nel server su base per connessione. Ciò significa che il valore restituito dalla funzione a un determinato client è il primo valore AUTO_INCREMENT generato per la dichiarazione più recente che interessa una colonna AUTO_INCREMENT da quel client.

Quindi questo non è influenzato da altre query che potrebbero essere in esecuzione sul server da altri utenti.

+6

sì ma cosa succede se nel frattempo (tra le query nell'elenco dei processi) è stata inserita qualche altra riga? Esiste un modo per scrivere la query di inserimento in modo che venga visualizzata questa? –

+0

Ok, vedo ... l'ultimo ID di inserimento della query viene registrato anche se non è stato registrato nel risultato ... $ mysqli-> insert_id –

+12

Questo ti restituirà il valore "PRIMARY KEY" dell'ultimo riga che * tu * inserisci, perché è per connessione - ogni connessione al server manterrà il proprio valore per questo. Ho aggiornato la risposta per chiarire questo. –

12

Dalla documentazione LAST_INSERT_ID():

L'ID che è stato generato è mantenuta nel server su una base per-collegamento

che è se si dispone di due richieste separate per lo script simultaneamente non si influenzano l'uno con l'altro 'LAST_INSERT_ID() (a meno che tu non stia usando una connessione persistente, forse).

13

Ecco quello che stai cercando !!!

select LAST_INSERT_ID() 

Questa è la migliore alternativa di SCOPE_IDENTITY() funzione utilizzata in SQL Server.

È inoltre necessario tenere presente che ciò funzionerà solo se Last_INSERT_ID() viene attivato in seguito alla query Insert. Questa è la query restituisce l'id inserito nello schema. Non puoi ottenere l'ultimo ID inserito della tabella specifica.

Per maggiori informazioni si prega di passare attraverso il link The equivalent of SQLServer function SCOPE_IDENTITY() in mySQL?

13

attenzione !! di "LAST_INSERT_ID()" se si tenta di restituire questo valore di chiave primaria all'interno di PHP.

So che questo thread non è codificato in php, ma per chiunque abbia trovato questa risposta cercando di restituire un ID di inserimento MySQL da un inserto con script PHP utilizzando le chiamate standard mysql_query - non funzionerà e non è ovvio senza catturare errori SQL.

Il mysqli più recente supporta più query - che LAST_INSERT_ID() è in realtà una seconda query dell'originale.

IMO una SELECT separata per identificare l'ultima chiave primaria è più sicura della funzione mysql_insert_id() opzionale che restituisce l'ID AUTO_INCREMENT generato dall'operazione INSERT precedente.

+4

'LAST_INSERT_ID' è una funzione MySQL per connessione. Se si esegue una query per l'ultimo ID di inserimento, è possibile che una connessione separata abbia eseguito una scrittura e che si disponga dell'ID errato. –

+0

@ExplosionPills 'mysql_insert_id()' funziona anche su base per connessione, ma soffre anche di strani comportamenti come visto qui http://stackoverflow.com/a/897374/1305910 nel commento di Cliffordlife - non importa se tutti dovremmo avere stavo usando 'mysqli' – RozzA

-6

Se LAST_INSERT_ID() si comporta un po 'strano o non funziona come lo è per me quindi utilizzare questa semplice affermazione ...

--- INSERT STATEMENT GOES HERE --- SELECT id FROM table ORDER BY id DESC LIMIT 1;

Ciò dovrebbe restituire il più grande ID nella tabella, così l'ultimo ID inserito

+2

Penso che se ci sono più thread che si inseriscono nella tabella, a volte potresti ottenere lo stesso ID di qualcun altro se non riesci a terminare INSERT e SELECT abbastanza velocemente e il tuo livello di isolamento è troppo basso. –

+0

questo soffre di 'race condition' – RozzA

3

Se è necessario il valore prima di inserire una riga:

CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50)) 
    RETURNS BIGINT 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
BEGIN 

    DECLARE Value BIGINT; 

    SELECT 
     AUTO_INCREMENT INTO Value 
    FROM 
     information_schema.tables 
    WHERE 
     table_name = TableName AND 
     table_schema = DATABASE(); 

    RETURN Value; 

END 

È possibile utilizzare questo in un inserto:

INSERT INTO 
    document (Code, Title, Body) 
VALUES (    
    sha1(concat (convert (now() , char), ' ', getAutoincrementalNextval ('document'))), 
    'Title', 
    'Body' 
); 
+0

Questo non sembra essere una buona idea? Se 2 client chiamano quella funzione nello stesso momento, penseranno che stanno inserendo lo stesso id quando in realtà non lo sono .... uno sarà leggermente più lento sull'inserto e otterrà il prossimo ID senza che lo sappia. – CarCar

+0

Utilizzerai questo codice all'interno di una transazione. –

Problemi correlati