Перейти к содержанию
СофтФорум - всё о компьютерах и не только

MySQL INSERT IGNORE и LAST_INSERT_ID()


Рекомендуемые сообщения

С базой 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 для проверки существования города и страны в базе не есть хорошо в плане производительности.

Возможно есть другие варианты реализации?

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Замените IGNORE на ON DUPLICATE UPDATE id=LAST_INSERT_ID(id) и будет вам счастье

 

Подробнее внизу: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...