Sign in to follow this  
Followers 0
Bingo

MySQL INSERT IGNORE и LAST_INSERT_ID()

2 posts in this topic

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

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

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Similar Content

    • By Leon-Killer22
      Доброго времени суток всем.
      Есть сервер MySQL 4.1, делается бэкап базы (3 ГБ) ежесуточно через mysqldump.
      Необходимо делать ежечасные бэкапы базы во время работы пользователей с базой.
      Когда-то где-то встречал решение, но, к сожалению, вообще не помню ни как это называется, ни как делается. Смысл сводился к быстрому (промежуточному?) бэкапу, дабы можно было восстановить информацию по состоянию за последний час, а не последние сутки.
      Полный бэкап делать не могу, т.к. много пользователей и мускль всех пошлет "НА" во время бэкапа.
      У кого-то есть мысли?
  • Recently Browsing   0 members