Tak tedy nedestruktivní verze. Nejprve vytvořím tabulku:
CREATE TABLE cabinet(id SERIAL, customer_id INTEGER, pin VARCHAR(8), used DATETIME);
Nyní ji naplním PINy - tohle je přidání jednoho PINu:
INSERT INTO cabinet(customer_id, pin) VALUES (42, '12345678');
Prosté ověření, zda je platný PIN:
SELECT customer_id FROM cabinet WHERE customer_id=:uniq AND pin=:pin AND used IS NULL;
Při úspěchu je počet nalezených záznamů ">0"
Ověření PINu a současně jeho zneplatnění:
UPDATE cabinet SET used=NOW() WHERE customer_id=:uniq AND pin=:pin AND used IS NULL;
Úspěch poznáš podle počtu ovlivněných řádek. "0" neúspěch, ">0" úspěch. Zároveň je záznam označen časovým razítkem použití.
A to je vše. Jedna tabulka - víc nepotřebuješ. Snad jen doplnit index:
CREATE INDEX cabinet_idx ON cabinet(customer_id, pin);
Pokud bys chtěl obnovit platnost kódů, stačí jen vymazat časová razítka.
UPDATE cabinet SET used=NULL;