- Связанные таблицы в MySQL
- Ошибка при использовании MySQL-запроса
IF EXISTS UPDATE ELSE INSERT
- Альтернативный MySQL-запрос для обновления или добавления записи в таблицу со связанным полем с другой таблицей
- Пример MySQL-запроса использования связанных таблиц по ключу.
Связанные таблицы в MySQL.
При работе со связанными таблицами, когда требуется создать новую запись в связанной таблице, если её ещё нет и обновить поля в этой записи, если она уже есть, требуется написать MySQL-запрос , выполняющий данные условия. Однако, при работе со связанными таблицами InnoDB
могут возникнуть проблемы в виде ошибки корректности использования условного оператора IF
, а также проверки EXISTS
. Решая данную задачу, я пришёл к выводу, что нужно использовать конструкцию ON DUPLICATE KEY UPDATE
, которая решает данную задачу без ошибок.
Ошибка при использовании MySQL-запроса IF EXISTS UPDATE ELSE INSERT
Итак, имеем две таблицы. Основная tableA
и связанная с ней tableВ
по полю id
. Казалось бы логично описать логику работы следующим SQL-запросом:
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'
Но, при попытке выполнить такой 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. Но данное решение может быть нужно и для массы других задач, которые требуют раздельного хранения суммарных значений по конкретным позициям какого-либо объекта.
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)