Dokumentace
pro LAST_INSERT_ID()
říká:
Když to víte, můžete z toho udělat vícekrokový proces:
- INSERT IGNORE
- pokud LAST_INSERT_ID(), tak hotovo (byl vložen nový řádek)
- jinak VYBERTE svůj_primární klíč FROM yourtable WHERE (jedinečná omezení vašich vložených dat)
Příklad se státy USA:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
Nyní vložení nového řádku:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Vložení řádku, který bude ignorován:
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!
Alternativně existuje možné řešení, jak to udělat v jednom kroku – použijte REPLACE INTO
místo INSERT IGNORE INTO
- syntaxe je velmi podobná
. Upozorňujeme však, že existují vedlejší účinky s tímto přístupem – tyto mohou nebo nemusí být pro vás důležité:
- REPLACE odstraní a znovu vytvoří řádek
- takže se spouštějí spouštěče DELETE
- také primární ID bude zvýšeno, i když řádek existuje
INSERT IGNORE
zachová data starého řádku,REPLACE
jej nahradí novými daty řádku