phpMyAdmin
 sql >> Database >  >> Database Tools >> phpMyAdmin

Incremento automatico per saltare i numeri?

Il comportamento di incremento automatico predefinito in MySQL 5.1 e versioni successive "perderà" i valori di incremento automatico se INSERT fallisce. Cioè, aumenta di 1 ogni volta, ma non annulla un incremento se INSERT fallisce. È raro perdere ~750 valori ma non impossibile (ho consultato un sito che ne saltava 1500 per ogni INSERT riuscito).

Puoi modificare innodb_autoinc_lock_mode=0 per utilizzare il comportamento di MySQL 5.0 ed evitare di perdere valori in alcuni casi. Vedere http://dev.mysql. com/doc/refman/5.1/en/innodb-auto-increment-handling.html per maggiori dettagli.

Un'altra cosa da controllare è il valore di auto_increment_increment variabile di configurazione. È 1 per impostazione predefinita, ma potresti averlo modificato. Ancora una volta, molto raro impostarlo su qualcosa di più alto di 1 o 2, ma possibile.

Sono d'accordo con altri commentatori, le colonne autoinc sono destinate ad essere uniche, ma non necessariamente consecutive. Probabilmente non dovresti preoccuparti così tanto a meno che tu non stia avanzando il valore autoinc così rapidamente da poter esaurire l'intervallo di un INT (questo è successo a me).

Come hai risolto esattamente saltando 1500 per sempre?

La causa dell'errore INSERT era che c'era un'altra colonna con un vincolo UNIQUE su di essa e INSERT stava tentando di inserire valori duplicati in quella colonna. Leggi la pagina di manuale a cui mi sono collegato per i dettagli sul perché questo è importante.

La soluzione consisteva nell'eseguire prima un SELECT per verificare l'esistenza del valore prima di tentare di INSERTrlo. Questo va contro il buon senso, che consiste semplicemente nel provare INSERT e gestire qualsiasi eccezione di chiave duplicata. Ma in questo caso, l'effetto collaterale dell'INSERT fallito ha causato la perdita di un valore di auto-inc. L'esecuzione di una SELECT ha prima eliminato quasi tutte queste eccezioni.

Ma tu anche devono gestire una possibile eccezione, anche se si SELECT prima. Hai ancora una condizione di razza.

Hai ragione! innodb_autoinc_lock_mode=0 ha funzionato a meraviglia.

Nel tuo caso, vorrei sapere perché così tanti inserti stanno fallendo. Sospetto che, come molti sviluppatori SQL, non stai controllando lo stato di successo dopo aver eseguito i tuoi INSERT nel tuo gestore AJAX, quindi non sai mai che così tanti di loro stanno fallendo.

Probabilmente stanno ancora fallendo, semplicemente non stai perdendo gli ID di auto-inc come effetto collaterale. Dovresti davvero diagnosticare perché si verificano così tanti errori. Potresti generare dati incompleti o eseguire molte più transazioni del necessario.