Два обновления MYSQL с условиями И МЕЖДУ ними

#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. я думаю, что вместо этого я буду использовать транзакцию, спасибо!