La documentazione
per LAST_INSERT_ID()
dice:
Sapendo questo, puoi renderlo un processo in più fasi:
- INSERIRE IGNORA
- se LAST_INSERT_ID(), fatto (è stata inserita una nuova riga)
- altrimenti SELEZIONA la tua_chiave primaria DALLA tua tabella DOVE (vincoli UNICI dei tuoi dati inseriti)
Esempio con stati USA:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
Ora, inserendo una nuova riga:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Inserimento di una riga che verrà ignorata:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AK','duplicate!');
> OK
SELECT LAST_INSERT_ID();
> "0"
// oops, it already exists!
SELECT id FROM `states` WHERE `abbrev` = 'AK'; // our UNIQUE constraint here
> "2"
// there we go!
In alternativa, c'è una possibile soluzione alternativa per farlo in un solo passaggio:usa REPLACE INTO
invece di INSERT IGNORE INTO
- la sintassi è molto simile
. Tieni presente, tuttavia, che ci sono effetti collaterali con questo approccio, questi possono essere importanti o meno per te:
- REPLACE cancella+ricrea la riga
- quindi i trigger DELETE sono, ehm, attivati
- inoltre, l'ID primario verrà incrementato anche se la riga esiste
INSERT IGNORE
mantiene i dati della vecchia riga,REPLACE
lo sostituisce con i nuovi dati di riga