Dokumentacja
dla LAST_INSERT_ID()
mówi:
Wiedząc o tym, możesz uczynić ten proces wieloetapowym procesem:
- WSTAW IGNORUJ
- jeśli LAST_INSERT_ID(), to zrobione (wstawiono nowy wiersz)
- w przeciwnym razie SELECT your_primary key FROM yourtable WHERE (unikalne ograniczenia wprowadzonych danych)
Przykład ze stanami USA:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
Teraz wstawiam nowy wiersz:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Wstawianie wiersza, który zostanie zignorowany:
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!
Alternatywnie, istnieje możliwość obejścia tego w jednym kroku — użyj REPLACE INTO
zamiast INSERT IGNORE INTO
- składnia jest bardzo podobna
. Pamiętaj jednak, że istnieją skutki uboczne przy takim podejściu — mogą one być dla Ciebie ważne lub nie:
- ZAMIEŃ usuwa + odtwarza wiersz
- więc wyzwalacze DELETE są, hm, wyzwalane
- także podstawowy identyfikator zostanie zwiększony, nawet jeśli wiersz istnieje
INSERT IGNORE
zachowuje stare dane wiersza,REPLACE
zastępuje go nowymi danymi wiersza