mysql - 使用 MySQL AFTER UPDATE 触发器更新基于 INT 值更改的另一个表中的列

标签 mysql triggers

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

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

Error code

1193 - Unknown system variable 'in_stock'

最佳答案

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

关于mysql - 使用 MySQL AFTER UPDATE 触发器更新基于 INT 值更改的另一个表中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53238816/

相关文章:

javascript - 模型 A 与模型 B Sequelize 错误无关

MySQL - 行更新触发错误

php - SQL 内部查询不提供输出

C#/SQL : 'System.Data.Objects.ObjectSet<DatabaseName.TableName> does not contain a definition for ' Local'

php - mysql INSERT INTO 语法错误 - 新用户 :)

sql - 使用触发器的 PostgreSQL 审计历史

sql - PostgreSQL 错误 : payload string too long

mysql - 如果mysql中某列是某个值,如何禁止更新表?

MySQL 使用触发器破坏外键

mysql - 触发错误 : SQL Error (1193): Unknown system variable 'Showedup'