Как сделать один запрос на ОБНОВЛЕНИЕ с разными ГДЕ? - PullRequest
1 голос
/ 03 марта 2020

Я хочу сделать один запрос с этим утверждением, но я не знаю, как

UPDATE alarm SET alarm1 = 1 , alarm1time = NOW() WHERE alarm1 != 1 AND id = 1;
UPDATE alarm SET alarm2 = 1 , alarm2time = NOW() WHERE alarm2 != 1 AND id = 1;
UPDATE alarm SET alarm3 = 1 , alarm3time = NOW() WHERE alarm3 != 1 AND id = 1;
UPDATE alarm SET alarm4 = 1 , alarm4time = NOW() WHERE alarm4 != 1 AND id = 1;
``

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Вы можете использовать выражение CASE:

UPDATE alarm
SET
    alarm1 = CASE WHEN alarm1 <> 1 THEN 1 ELSE alarm1 END,
    alarm1time = CASE WHEN alarm1 <> 1 THEN NOW() ELSE alarm1time END,
    alarm2 = CASE WHEN alarm2 <> 1 AND THEN 1 ELSE alarm2 END,
    alarm2time = CASE WHEN alarm2 <> 1 THEN NOW() ELSE alarm2time END,
    alarm3 = CASE WHEN alarm3 <> 1 THEN 1 ELSE alarm3 END,
    alarm3time = CASE WHEN alarm3 <> 1 THEN NOW() ELSE alarm3time END,
    alarm4 = CASE WHEN alarm4 <> 1 THEN 1 ELSE alarm4 END,
    alarm4time = CASE WHEN alarm4 <> 1 THEN NOW() ELSE alarm4time END
WHERE id = 1;

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

0 голосов
/ 03 марта 2020
WHERE id = 1 AND ( alarm1 != 1 OR alarm2 != 1 OR ... )

Должно быть в порядке, но каждая база данных использует свой синтаксис, поэтому ( ) может быть проблемой там.

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