Se crei la seguente tabella:
CREATE TABLE sequence (
sequence_id BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sequence_id`)
)
Quindi emetti queste tre query una dopo l'altra:
INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SELECT LAST_INSERT_ID() AS sequence;
La terza query è garantita per restituire un numero di sequenza univoco. Questa garanzia è valida anche se hai dozzine di programmi client diversi collegati al tuo database. Questa è la bellezza di AUTO_INCREMENT.
Invece di generare solo undici milioni di questi numeri di sequenza in anticipo, puoi utilizzare queste query SQL per ottenere un numero di sequenza univoco ogni volta che ne hai bisogno.
Se devi eseguire il wrapping al numero di sequenza 12 milioni, puoi invece utilizzare queste query.
INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SELECT LAST_INSERT_ID() MOD 12000000 AS sequence;
Il trucco qui è utilizzare un numero di sequenza di incremento automatico per l'unicità, ma anche eliminare le righe nella tabella in modo da non divorare molto spazio.
Nota che puoi anche utilizzare il numero di sequenza di LAST_INSERT_ID() per altri scopi, ad esempio.
INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
INSERT INTO user (userid, username, phone)
VALUES (LAST_INSERT_ID() MOD 12000000, 'Joe', '800-555-1212');
SELECT LAST_INSERT_ID() MOD 12000000 AS sequence;