【问题标题】:Update Column in Another Table Based off INT value Change using MySQL AFTER UPDATE Trigger使用 MySQL AFTER UPDATE 触发器更新另一个表中的列基于 INT 值更改
【发布时间】:2019-04-13 19:06:09
【问题描述】:

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

MPN 在我的products 表中既是唯一键又是外键,因此只要表product_stock 中的available 列中的正值in_stock 中的mpn 值@987654330 @table 应该设置为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”

【问题讨论】:

    标签: mysql triggers


    【解决方案1】:

    您不能单独使用SET 更新另一个表中的值。您需要使用正确的UPDATE 语句来执行此操作。

    我还添加了更多条件,使其不会每次都触发UPDATE 查询。仅当所需的 in_stock 值发生更改时,它才会触发 UPDATE

    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 ;
    

    【讨论】:

    • 甚至没有包含这个词的意思 :) 感谢您指出这一点。用新的错误消息更新了我的问题..
    • @BrianBruman 检查更新的答案。您需要使用更新查询
    • 太棒了!有用。唯一缺少的是开头的DELIMITER $$,以便查询处理它并启用触发器。但是,是的,只是对其进行了测试,并且可以正常工作。非常感谢。
    • @BrianBruman 检查进一步更新的答案。我已经优化过了。
    • 当然可以。即使一种尺寸/行有 0 个可用,它也会恢复到缺货状态(即使其他尺寸/行有库存)。再次感谢你让我走上正轨。
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2017-06-15
    • 2013-01-24
    • 2019-10-13
    • 1970-01-01
    相关资源
    最近更新 更多