Prima di tutto, quale vantaggio stai cercando di ottenere riutilizzando i valori ignorati? Un ordinario INT UNSIGNED
ti consente di contare fino a 4.294.967.295. Con "milioni di record" il tuo database dovrebbe crescere mille volte prima di esaurire gli ID validi. (E quindi utilizzando un BIGINT UNSIGNED
si imbatterà fino a 18,446,744,073,709,551,615 valori.)
Cercando di riciclare i valori MySQL ha saltato rischia di consumare un sacco di tempo a cercare di compensare qualcosa che in realtà non si preoccupa di MySQL nel primo posto.
Detto questo, è possibile trovare gli ID mancante con qualcosa di simile:
SELECT id + 1
FROM the_table
WHERE NOT EXISTS (SELECT 1 FROM the_table t2 WHERE t2.id = the_table.id + 1);
Questo troverà solo il primo numero di manca in ogni sequenza (ad esempio, se si dispone di {1, 2, 3, 8, 10}
troverà {4,9}
), ma è probabile che sia efficiente e, naturalmente, una volta che hai inserito un ID, puoi sempre eseguirlo di nuovo.
Correlati: http://stackoverflow.com/questions/3718229/stop-mysql-reusing-auto-increment-ids –
Se stai usando un INT per la tua chiave primaria, puoi avere come 2 miliardi + record. Perché preoccuparsi di cercare di colmare le lacune? Stai finendo i numeri? Trovo che ci sia un vantaggio nel sapere che i numeri corrispondono all'ordine in cui sono stati aggiunti i record. – minboost
Forse avrai meno problemi di prestazioni modificando il tuo tipo di chiave primaria in BIGINT (se i valori di 4 billon forniti da INT sono troppo brevi) rispetto al tentativo di riutilizzare gli ID su una tabella molto grande. –