Dokumentationen
for LAST_INSERT_ID()
siger:
Når du ved dette, kan du gøre dette til en flertrinsproces:
- INDSÆT IGNORER
- hvis LAST_INSERT_ID(), så færdig (ny række blev indsat)
- ellers VÆLG din_primære nøgle FRA din tabel WHERE (dine indsatte datas UNIKKE begrænsninger)
Eksempel med amerikanske stater:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
Indsætter nu en ny række:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Indsættelse af en række, som vil blive ignoreret:
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!
Alternativt er der en mulig løsning til at gøre dette i ét trin - brug REPLACE INTO
i stedet for INSERT IGNORE INTO
- syntaksen er meget ens
. Bemærk dog, at der er bivirkninger med denne tilgang - disse kan være vigtige for dig eller ikke:
- REPLACE sletter+genskaber rækken
- så DELETE-udløsere udløses, um,
- Det primære ID vil også blive forøget, selvom rækken eksisterer
INSERT IGNORE
beholder de gamle rækkedata,REPLACE
erstatter det med nye rækkedata