#mysql
Вопрос:
как я могу выполнить приведенный ниже запрос на обновление в одной фразе? Спасибо.
UPDATE tableA SET ColumnA = 1 WHERE id_tableA = 10000 AND (date_tableA BETWEEN '2021-06-01' AND '2021-06-30');
UPDATE tableB SET ColumnB = 1 WHERE id_tableB = 10000 AND (date_tableB BETWEEN '2021-06-01' AND '2021-06-30');
я попробовал приведенный ниже код, но он просто ничего не обновит:
UPDATE tableA AS a, tableB AS b
SET a.ColumnA = 1, b.Column = 1
WHERE a.id = 10000 AND b.id = 10000 AND
((a.date_tableA BETWEEN '2021-06-01' AND '2021-06-30') OR
(b.date_tableB BETWEEN '2021-06-01' AND '2021-06-30'))
приведенный выше код хорошо работает без указания даты между условиями.
Комментарии:
1. Вы говорите о сделке?
2. Привет, я только что пытался использовать запятую, но все идет хорошо, пока не придет время между условиями. Когда я добавляю дату между условиями, она ничего не обновляет.
3. Вы имеете в виду обновить обе таблицы в одном запросе? Я не думаю, что вы можете это сделать, но использование транзакции даст вам то, что, как я полагаю, вы ищете. Транзакции не будут обновлять индексы до тех пор, пока они не будут зафиксированы. См.: dev.mysql.com/doc/refman/8.0/en/commit.html
4. Я не думаю, что вы можете объединить оба утверждения, так как это 2 разные таблицы. Кстати, почему вы оставили кавычки в датах во втором запросе.
5. Привет, Ракетная защита, это была просто опечатка, в моем коде появилось «а», но результат просто ничего не обновит без каких-либо ошибок.
Ответ №1:
Если date_tableA
и date_tableB
являются DATE
полями, то вам нужно отфильтровать их, используя правильный формат.
MySQL ожидает, что даты будут в YYYY-MM-DD
формате.
См.: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html
UPDATE tableA SET ColumnA = 1
WHERE id_tableA = 10000 AND (date_tableA BETWEEN '2021-06-01' AND '2021-06-30');
UPDATE tableB SET ColumnB = 1
WHERE id_tableB = 10000 AND (date_tableB BETWEEN '2021-06-01' AND '2021-06-30');
Примечание: В июне 30 дней, а не 31.
Если вы хотите объединить, вы можете использовать UPDATE
с JOIN
.
UPDATE tableA, tableB
JOIN tableB ON id_tableA = id_tableB
SET tableA = 1, tableB = 1
WHERE id_tableA = 10000
AND (date_tableA BETWEEN '2021-06-01' AND '2021-06-30')
AND (date_tableB BETWEEN '2021-06-01' AND '2021-06-30');
Это может сработать, если существует реальная связь между tableA
и tableB
. Если это несвязанные таблицы, то я бы не стал предлагать JOIN
.
Вы также можете использовать транзакцию, чтобы индексы не обновлялись до тех пор, пока не будут выполнены все обновления.
START TRANSACTION;
UPDATE tableA SET ColumnA = 1
WHERE id_tableA = 10000 AND (date_tableA BETWEEN '2021-06-01' AND '2021-06-30');
UPDATE tableB SET ColumnB = 1
WHERE id_tableB = 10000 AND (date_tableB BETWEEN '2021-06-01' AND '2021-06-30');
COMMIT;
Комментарии:
1. Привет, Ракета, в реальном коде такой проблемы нет, и это была просто опечатка.
2. @AnthonyTam Может ли проблема быть в том, что 31 июня не существует? 😛
3. снова опечатка =P извините, я установил дату начала как первый день месяца, а дату окончания как сегодня
4. я думаю, что вместо этого я буду использовать транзакцию, спасибо!