Обновление столбца в другой таблице на основе значения INT Изменение с использованием MySQL AFTER UPDATE Trigger - PullRequest
0 голосов
/ 10 ноября 2018

Получение ошибки после ошибки. В основном я пытаюсь установить значение столбца на 1 в моей таблице products автоматически, если при обновлении таблицы product_stock столбец available больше 0 (имеется в виду, по крайней мере, один на складе).

MPN является уникальным и внешним ключом в моей таблице products, поэтому положительное значение в столбце available в таблице product_stock значение in_stock для mpn в products таблица должна быть установлена ​​на 1.

Две таблицы, с которыми я работаю:

1

CREATE TABLE `products` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `mpn` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `in_stock` int(1) NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`),
 UNIQUE KEY `mpn` (`mpn`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

2

CREATE TABLE `product_stock` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `mpn` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `size` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `available` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `product_stock_ibfk_1` (`mpn`),
 CONSTRAINT `product_stock_ibfk_1` FOREIGN KEY (`mpn`) REFERENCES `products` (`mpn`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

И один вариант моего триггера

DELIMITER $$

    CREATE TRIGGER ps_update AFTER UPDATE ON `product_stock`
    FOR EACH ROW BEGIN
      IF NEW.available > 0 THEN
            SET products.in_stock = 1;
      ELSE
            SET products.in_stock = 0;
      END IF;
    END$$

DELIMITER ;

Код ошибки

1193 - неизвестная системная переменная 'in_stock'

1 Ответ

0 голосов
/ 10 ноября 2018

Вы не можете обновить значение в другой таблице, используя только SET. Для этого вам нужно использовать правильный оператор UPDATE.

Я также добавил больше условий, чтобы он не запускал UPDATE запрос каждый раз. Он будет срабатывать UPDATE только при изменении требуемого значения in_stock.

DELIMITER $$
CREATE TRIGGER ps_update AFTER UPDATE ON `product_stock`

    FOR EACH ROW BEGIN

      -- update only when there is a change in the available
      IF NEW.available <> OLD.available THEN 

        -- update only when item becomes in_stock
        IF NEW.available > 0 AND OLD.available <= 0 THEN 
            UPDATE products 
            SET products.in_stock = 1 
            WHERE products.mpn = NEW.mpn;

        -- update only when item becomes out_stock
        ELSEIF NEW.available <= 0 AND OLD.available > 0 THEN 
            UPDATE products 
            SET products.in_stock = 0 
            WHERE products.mpn = NEW.mpn;
        END IF;
      END IF;
   END $$
DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...