De documentatie
voor LAST_INSERT_ID()
zegt:
Als je dit weet, kun je er een proces van meerdere stappen van maken:
- INVOEREN NEGEREN
- if LAST_INSERT_ID(), dan klaar (nieuwe rij is ingevoegd)
- anders SELECTEER uw_primaire sleutel UIT uw tabel WAAR (de UNIEKE beperkingen van uw ingevoegde gegevens)
Voorbeeld met Amerikaanse staten:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
Nu een nieuwe rij invoegen:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Een rij invoegen die wordt genegeerd:
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!
Als alternatief is er een mogelijke oplossing om dit in één stap te doen - gebruik REPLACE INTO
in plaats van INSERT IGNORE INTO
- de syntaxis lijkt erg op elkaar
. Houd er echter rekening mee dat er bijwerkingen zijn met deze benadering - deze kunnen al dan niet belangrijk voor u zijn:
- REPLACE verwijdert+maakt de rij opnieuw
- dus DELETE-triggers zijn, um, getriggerd
- ook wordt de primaire ID verhoogd, zelfs als de rij bestaat
INSERT IGNORE
behoudt de oude rijgegevens,REPLACE
vervangt het door nieuwe rijgegevens