2010-06-28 2 views
6

Sto cercando di recuperare l'id di una tabella A da inserire in un'altra tabella B. Non posso usare last_insert_id() perché non ho inserito nulla in A. Qualche idea su come fare questo bene?SELEZIONA l'ultimo ID, senza INSERT

$n = mysql_query("SELECT max(id) FROM tablename"); non sembra funzionare, né

$n = mysql_query("SELECT max(id) FROM tablename GROUP BY id"); 
+0

Che motore? mysql, mssql? accesso? – masfenix

+0

Cosa intendi con "non sembra funzionare"? –

+0

Definire "non sembra funzionare". Cosa non funziona? Cosa restituisce? Cosa dovrebbe? – CaffGeek

risposta

15

In MySQL, questo non restituire il valore più elevato dalla colonna id:

SELECT MAX(id) FROM tablename; 

Tuttavia, questo non mette che id in $n:

$n = mysql_query("SELECT max(id) FROM tablename"); 

Per ottenere il valore, avete bisogno di fare questo:

$result = mysql_query("SELECT max(id) FROM tablename"); 

if (!$result) { 
    die('Could not query:' . mysql_error()); 
} 

$id = mysql_result($result, 0, 'id'); 

Se si desidera ottenere l'ultimo ID inserto da A, e inserirla in B, è possibile farlo con un solo comando:

INSERT INTO B (col) SELECT MAX(id) FROM A; 
0

penso di aggiungere timestamp per ogni record e ottenere l'ultimo. In questa situazione puoi ottenere qualsiasi ID, pack di file e altre operazioni.

0

È possibile get maximum column value and increment it:

InnoDB utilizza il seguente algoritmo per inizializzare il contatore di incremento automatico per una t tabella che contiene un AUTO_INCREMENT colonna denominata ai_col: Dopo un avvio del server, per la prima inserire in una tabella t, InnoDB esegue l'equivalente di questa affermazione:

SELECT MAX(ai_col) FROM t FOR UPDATE; 

InnoDB incrementa di uno il valore recuperato dall'istruzione e assegna alla colonna e al contatore di incremento automatico per la tabella. Se la tabella è vuota, InnoDB utilizza il valore di 1.

Inoltre è possibile utilizzare SHOW TABLE STATUS e il suo valore "auto_increment".

+0

Quanto è thread-safe questo? –

+0

"per aggiornamento" indica che la tabella è bloccata per la scrittura fino alla fine della selezione. Ovviamente sarà meglio selezionare il valore massimo e inserirlo in una transazione che blocca queste due tabelle. – silent

+1

Blocco per le scritture ?! Ahia. –

0

Si poteva ordinare il modo discendente tabele da id e limitare il numero di risultati da uno:

SELECT id FROM tablename ORDER BY id DESC LIMIT 1 

MA:ORDER BY riorganizza l'intera tabella per questa richiesta. Quindi se hai molti dati e hai bisogno di ripetere questa operazione più volte, non consiglierei questa soluzione.