пожалуйста, посмотрите на изображение, вы найдете mysql CASE WHEN, даже если условие ложно
_skus
sku_id is_available is_quantity quantity
13 1 0 NUll
UPDATE _skus
SET is_available = CASE
WHEN is_quantity = 1 AND quantity=0 THEN 0
END
WHERE sku_id=13
после выполнения оператора MySQL
sku_id is_available is_quantity quantity
13 0 0 NUll
is_available обновлен до 0, даже если условие неверно
таблица _skus
CREATE TABLE `_skus` (
`sku_id` int(11) NOT NULL AUTO_INCREMENT,
`is_available` tinyint(1) NOT NULL,
`is_quantity` tinyint(1) NOT NULL,
`quantity` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`sku_id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
INSERT INTO `_skus` VALUES (13, 1, 0, NULL);
Вы можете исправить это, удалив CASE
и переместив условия is_quantity = 1 and quantity=0
в часть WHERE
:
UPDATE _skus
SET is_available = 0
WHERE sku_id = 13
AND is_quantity = 1
AND quantity = 0;
Основная проблема заключается в следующем:
UPDATE TABLE xy
SET col = CASE WHEN ... END
WHERE condition
определяется для применения ко всем строкам таблицы, где встречается WHERE condition
. Т.е. даже если условие CASE
не выполняется, со значением col
нужно что-то сделать... для этой строки. Таким образом, в качестве возврата из CASE
используется неявное значение по умолчанию. Кажется, в вашем случае это 0
. Не знаю, почему это вообще работает для вас. Если я запущу ваш пример в dbfiddle, я получу ошибку, потому что CASE
возвращает NULL
как значение по умолчанию, когда условие WHEN
не выполняется. Но NULL
не разрешено для столбца is_available
.
Есть две возможности
Переместите условие в предложение WHERE
, чтобы UPDATE
распространялось только на строки с этим конкретным условием.
UPDATE _skus
SET is_available = 0
WHERE is_quantity = 1 AND quantity = 0 AND sku_id = 13
Добавьте в свой случай ветку ELSE
со значением по умолчанию, которое будет установлено, если условие не выполнено. Например, вы можете использовать текущее значение is_available
в качестве значения по умолчанию.
UPDATE _skus
SET is_available = CASE
WHEN is_quantity = 1 AND quantity = 0 THEN 0
ELSE is_available
END
WHERE sku_id = 13
Вариант (1), по-видимому, подойдет здесь, поскольку вы уже фильтруете одну конкретную строку для обновления. Таким образом, вы можете легко добавить дополнительное условие, чтобы определить, необходимо обновление или нет.