Условная вставка в MariaDB (MySQL) - PullRequest
0 голосов
/ 20 января 2019

У меня есть две таблицы.Первый содержит данные о датчиках (группа, имя, последнее обновление и т. Д.).Во-вторых, показания для всех датчиков.

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

Я попробовал несколько утверждений IF, но без удачи.Должен ли я пойти для вставки и "где IN ()"?

1 Ответ

0 голосов
/ 20 января 2019

Вы на правильном пути.По сути, это INSERT с предложением WHERE. Итак, вам нужно создать запись в таблице «Чтения» для датчиков, которые имеют ОБНОВЛЕНИЕ за последние X дней (в моем примере это 10 ниже)

Что-то вроде:

insert into readings
select 1 as id, id as sens_id, null as info
from sensors
where datediff(now(),latest_update) > 10;

В моем примере я предоставляю идентификатор, но я предполагаю, что в вашем BD это целое число с автоинкрементом ...

, а затем обновите поле UPDATE ...

update sensors set latest_update = now()
where datediff(now(),latest_update) > 10;

Иди, попробуй сам ...

https://www.db -fiddle.com / f / u1EWRpH7nbxHEjwBDUgwLh / 0

ОБНОВЛЕНИЕ:

https://www.db -fiddle.com / f / u1EWRpH7nbxHEjwBDUgwLh / 1

Если last_update проиндексирован, я предлагаю вместо этого:

where date_add(now(),INTERVAL -10 DAY) > latest_update;

чтобы извлечь выгоду из индексации.

"Когда вы оборачиваете функцию вокруг индексированного столбца, SQL Server должен вычислить значение функции для каждой строки в таблице. Когда вы просто сравниваете индексированный столбец со скалярным значениемили результат функции, то SQL Server может использовать это значение для поиска в индексе. "

Не совсем точно для MySQL, так как я не тестировал его в этом случае, но чтобы быть уверенным :)

https://www.sqlteam.com/articles/avoid-enclosing-indexed-columns-in-a-function-in-the-where-clause

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...