Newsgroup: it.comp.software.database
Titolo: [MYSQL] Max vs last_id

Salve a tutti,
	partendo dal presupposto di bloccare qualsiasi operazione in una 
tabella se effettuo delle operazioni sui record, che differenza ci può 
essere tra la funzione max(id) e last_id? Nella mia tabella l'id è auto 
incrementale. L'unica che mi viene può essere, e correggetemi se 
sbaglio, che max(id) vuole che il campo id sia numerico mentre last_id 
torna l'ultimo valore inserito nel campo indicato anche se questo non è 
un numero... è corretto?
Grazie!

nulla?

> Torakiki

 (credo) debbe essere unico, che succede?
Non ho capito... se in una tabella con id autoicrementale 2 utenti fanno 
una select max(id) avranno lo stesso numero.
Ma la mia domanda è differente. Se io devo fare una insert e farmi 
restituire l'ultimo id inserito com'è meglio che procedo?
Opzione 1:
- lock tabella
- inserisco un record che mi auto genera un nuovo id (chiaramente)
- effettuo una select max(id)
- la select mi restituisce l'ultimo id inserito
- salvo l'id
- sblocco la tabella
Opzione 2:
- lock tabella
- inserisco un record che mi auto genera un nuovo id (chiaramente)
- effettuo una select last_id
- la select mi restituisce l'ultimo id inserito
- salvo l'id
- sblocco la tabella
Per me la procedura porterebbe allo stesso risultato...
Voi che dite?

 Per me la procedura porterebbe allo stesso risultato...
Premetto di non essere un esperto di MySQL; con la tabella bloccata 
credo che siano funzionalmente equivalenti, se hai un indice su ID forse 
il primo metodo è il più veloce?
-- 
Fa freddo nello scriptorium, il pollice mi duole. Lascio questa 
scrittura, non so per chi, non so più intorno a che cosa...
U. Eco

 Voi che dite?
Sì, ma l'opzione 2 è più rapida (non effettua una ulteriore query sulla 
tabella, ha il valore già memorizzato nel db).
L'opzione 1 però è indipendente dal DB, vantaggio non da poco, IMHO.
Ciao,
Paolo

 la funzione max(id) e last_id?
Il max() restituisce il numero piu' ALTO.
Il last_insert_id() restituisce l'ULTIMO inserito _con successo_ nella
stessa sessione (li facciamo i controlli, vero?).
Queste, a seconda di varie circostanze, possono oppure no
restituirti lo stesso valore (tuttosommato servono a scopi
differenti, per cui non vedo perche' dovrebbero essere equivalenti).
A seconda di cosa ti serve, dovrebbe essere banale decidere quale
faccia al caso tuo.
Il lock di un'intera tabella e' fortemente negativo per la
concorrenza, oltre che evitabile. Trovo inoltre che la concorrenza
concepita in questo modo porta a ragionamenti errati;
ad esempio lo sai che ci sono varie situazioni per cui ti ritrovi
con dei buchi nella sequenza?.
La maggioranza crede che l'autoincrement serva per generare
sequenze, quanto invece serve per generare identita' (falsamente)
univoca.
Mi chiedo quanti dba si pongono queste domande, e quanti programmi
ci sono in giro che, come bombe a tempo, attendono solamente la
condizione particolare di "ma tanto e' improbabile che succeda"
per dare errori.
E ora, per conciliare il sonno, una citazione dal manuale di MySql:
"The behavior of the auto-increment mechanism is not defined if a
user assigns a negative value to the column or if the value becomes
bigger than the maximum integer that can be stored in the specified
integer type".
"not defined" tic tac tic tac...