Рейтинг:  3 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда не активнаЗвезда не активна
 

Решение для ошибки MySQL-запроса IF EXISTS UPDATE ELSE INSERT

При работе со связанными таблицами, когда требуется создать новую запись в связанной таблице, если её ещё нет и обновить поля в этой записи, если она уже есть, требуется написать MySQL-запрос , выполняющий данные условия. Однако, при работе со связанными таблицами InnoDB могут возникнуть проблемы в виде ошибки корректности использования условного оператора IF, а также проверки EXISTS. Решая данную задачу, я пришёл к выводу, что нужно использовать конструкцию  ON DUPLICATE KEY UPDATE, которая решает данную задачу без ошибок.



Ошибка при использовании MySQL-запроса IF EXISTS UPDATE ELSE INSERT

Итак, имеем две таблицы. Основная tableA и связанная с ней tableВ по полю id. Казалось бы логично описать логику работы следующим SQL-запросом:

IF EXISTS(SELECT * FROM `tableB` WHERE id = `тут id ключа`) 
   UPDATE `tableB`
      SET var_1 = `значение1`, var_2 = `значение2` //..и т.д. для обновления тех полей, значения которых нужно обновить
    WHERE id = `тут id ключа` // в записи, содержащей ключ id
ELSE 
    INSERT INTO `tableB` (`id`, `var_1`, `var_2`)
    VALUES ('тут id ключа', 'значение1', 'значение2')

Но, при попытке выполнить такой SQL-запрос сыплются ошибки и жалобы, то на неправильное применение условного оператора IF, то какие-то проблемы рядом с проверкой EXISTS. Все попытки привести данный запрос к работающему виду у меня не привели ни к какому результату. Поэтому вместо него я попробовал другую конструкцию SQL-запроса, выполняющего эту же логику, но без ошибок отрабатывающего необходимые действия.

Альтернативный MySQL-запрос для обновления или добавления записи в таблицу со связанным полем с другой таблицей

Итак, вся эта задача сводится к тому, чтобы в связанной таблице tableВ содержались записи с уникальными ключами id. И если в ней уже есть запись с этим ключом, то не создавать ещё одну запись, а обновить поля в имеющейся. Используем следующий SQL-запрос, содержащий функцию работы с ключами ON DUPLICATE KEY UPDATE:

INSERT INTO `tableB` (`id`,`var_1`,`var_2`)
  VALUES ('тут id ключа','значение1','значение2') // и это отработает, если id в таблице tableB ещё нет
ON DUPLICATE KEY UPDATE //а то, что ниже, просто обновит запись, содержащую id
  `var_1` = 'значение1',
  `var_2` = 'значение2'

И этот запрос обрабатывается правильно.

Пример MySQL-запроса использования связанных таблиц по ключу

Обычно в связанной таблице хранятся какие-то счётчики, и логику их работы можно выполнять не скриптом, а непосредственно в запросе, используя базу данных, поэтому последние две строчки могут выглядеть так:

  `var_1` = `var_1` + 'значение1',
  `var_2` = `var_2` + 'значение2'

Таким образом, можно разгрузить основную таблицу tableA, не храня значения счётчиков в ней, а вынести эти счётчики в отдельную связанную по ключу таблицу tableB. И дело не только в том, что в основной таблице станет меньше полей, а ещё и в том, что если для работы требуется чаще значения счётчиков, то и запросы в более короткой таблице, содержащие значения этих счётчиков будут получены быстрее и проще.

Мне это понадобилось для разделения таблицы, содержащей список транзакций пользователей (tableA) и таблицы, содержащей состояние счёта пользователей (tableB) при написании биллинга на сайте, работающем на CMS Joomla. Но данное решение может быть нужно и для массы других задач, которые требуют раздельного хранения суммарных значений по конкретным позициям какого-либо объекта.

Заберите ссылку на статью к себе, чтобы потом легко её найти ;)

Выберите, то, чем пользуетесь чаще всего:

Спасибо за внимание, оставайтесь на связи! Ниже ссылка на форум и обсуждение ; )


Обсудить эту статью

INFO: Вы отправляете сообщение как 'Гость'