Ошибка MYSQL: столбец не может быть пустым в запросе на обновление - PullRequest
1 голос
/ 14 апреля 2019

У меня есть запрос на обновление SQL, который работает нормально.

Update inventory set reserved = reserved - 
CASE 
    WHEN location_id = 23 and variant_id = 40 then 2
    WHEN location_id = 13 and variant_id = 20 then 3
end 
where (location_id = 23 and variant_id = 40) or 
      (location_id = 13 and variant_id = 20);

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

WHEN location_id = 13 and variant_id = 20 and reserved > 0 then 3

Но он выдает ошибку «Зарезервированный столбец не может быть пустым».Как я могу решить это?

1 Ответ

2 голосов
/ 14 апреля 2019

Поскольку условия в вашем выражении CASE не совпадают с условиями в вашем предложении WHERE, вам нужно выражение ELSE в вашем выражении CASE, чтобы, когда ни одно из условий WHEN не выполнялось, вы не возвращают значение NULL, которое затем вызывает

reserved - (CASE ...) 

будет NULL, давая вам ошибку, которую вы видите. Попробуйте это:

Update inventory set reserved = reserved - 
CASE 
    WHEN location_id = 23 and variant_id = 40 then 2
    WHEN location_id = 13 and variant_id = 20 and reserved > 0 then 3
    ELSE 0
end 
where (location_id = 23 and variant_id = 40) or 
      (location_id = 13 and variant_id = 20);

В качестве альтернативы, чтобы предотвратить падение значения ниже 0, вы можете рассмотреть возможность использования LEAST для предотвращения вычитания значения, которое больше текущего значения reserved, например

Update inventory set reserved = reserved - 
CASE 
    WHEN location_id = 23 and variant_id = 40 then LEAST(2, reserved)
    WHEN location_id = 13 and variant_id = 20 then LEAST(3, reserved)
end 
where (location_id = 23 and variant_id = 40) or 
      (location_id = 13 and variant_id = 20);
...