Документацията
за LAST_INSERT_ID()
казва:
Знаейки това, можете да направите това многоетапен процес:
- ВМЕСЕТЕ ИГНОРИРАНЕ
- ако LAST_INSERT_ID(), тогава готово (вмъкнат е нов ред)
- иначе ИЗБЕРЕТЕ своя_първичен ключ ОТ вашата таблица КЪДЕ (УНИКАЛНИ ограничения за вмъкнатите ви данни)
Пример с щати на САЩ:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
Сега вмъкване на нов ред:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Вмъкване на ред, който ще бъде игнориран:
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!
Алтернативно, има възможно заобиколно решение, за да направите това в една стъпка - използвайте REPLACE INTO
вместо INSERT IGNORE INTO
- синтаксисът е много подобен
. Имайте предвид обаче, че има странични ефекти с този подход - това може или не може да е важно за вас:
- REPLACE изтрива+пресъздава реда
- така че тригерите DELETE се задействат, хм,
- също така, основният идентификатор ще бъде увеличен, дори ако редът съществува
INSERT IGNORE
запазва старите данни за ред,REPLACE
заменя го с нови данни за ред