Dokumentationen
för LAST_INSERT_ID()
säger:
Genom att veta detta kan du göra detta till en process i flera steg:
- INSERT IGNORE
- om LAST_INSERT_ID(), då klar (ny rad infogades)
- annars VÄLJ din_primära nyckel FRÅN din tabell WHERE (din infogade datas UNIKA begränsningar)
Exempel med delstater i USA:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
Nu infogar du en ny rad:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Infoga en rad som kommer att ignoreras:
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 finns det en möjlig lösning för att göra detta i ett steg - använd REPLACE INTO
istället för INSERT IGNORE INTO
- syntaxen är väldigt lik
. Observera dock att det finns biverkningar med detta tillvägagångssätt - dessa kan vara viktiga för dig eller inte:
- REPLACE tar bort+återskapar raden
- så DELETE-utlösare utlöses, um,
- Det primära ID:t kommer också att ökas även om raden finns
INSERT IGNORE
behåller den gamla raddatan,REPLACE
ersätter den med ny raddata