С базой MySQL работает веб-приложение, поэтому запросы должны быть максимально оптимизированы на скорость выполнения.
Есть 3 связанные таблицы:
1) Главная таблица содержит ряд полей, среди которых поле-индекс town_id связывающее ее со 2й таблицей
2) таблица town содержит поля:
town_id (bigint) PRIMARY AUTO_INCREMENT
country_id (int) INDEX
town (varchar)
поля country_id и town объединены в ключ UNIQUE
3) таблица country
country_id (int) PRIMARY AUTO_INCREMENT
country (varchar) UNIQUE
При INSERT или UPDATE главной таблицы данные от пользователя поступают в виде town=Город country=Страна
соответственно выполняю ряд запросов:
INSERT IGNORE INTO country (country) VALUES('Страна');
INSERT IGNORE INTO town (country_id, town) VALUES(LAST_INSERT_ID(), 'Город');
UPDATE main_table SET town_id=LAST_INSERT_ID() WHERE ...
Проблема в том что если INSERT IGNORE не вставил новую запись (при совпадении UNIQUE полей) то LAST_INSERT_ID() возвращает некорректное значение. Выполнять 2 лишних запроса SELECT для проверки существования города и страны в базе не есть хорошо в плане производительности.
Возможно есть другие варианты реализации?