根据INT值更改使用MySQL AFTER UPDATE触发器更改另一个表中的更新列

时间:2018-11-10 12:11:02

标签: mysql triggers

一次又一次出错。基本上,如果在更新1表时,列products大于0(意味着,在product_stock表中,列值自动设置为available表中的products至少有一个库存)。

MPN在我的available表中既是唯一键又是外键,因此只要表product_stock的{​​{1}}列in_stock的{​​{1}}值中的正值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 :(得分:1)

不能单独使用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 ;