字段值改变时MySQL触发

标签 mysql database triggers database-trigger

我在数据库中有 3 个表:

  1. 产品

    CREATE TABLE `product` (
    `product_id` int(11) NOT NULL,
    `product_name` varchar(50) NOT NULL,
    `product_stock` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. 交易

    CREATE TABLE `transaction` (
    `transaction_id` int(11) NOT NULL,
    `user_id` int(11) NOT NULL,
    `transaction_date` datetime NOT NULL,
    `transaction_status` ENUM('pending','process','cancel') NOT NULL DEFAULT 'pending'
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  3. 交易详情

    CREATE TABLE `transaction_details` (
    `transaction_id` int(11) NOT NULL,
    `product_id` int(11) NOT NULL,
    `qty` int(11) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    

如果 transaction 表中的 transaction_status 更改为“取消”如何使用触发器根据 transaction_details 表中的 qty 更新 product 表中的 product_stock

最佳答案

这个触发器应该做你想做的。在 transaction 上的 UPDATE 之后,它会更新交易中所有产品的库存(通过在所有三个表上使用 JOIN 来查找相关产品交易):

CREATE TRIGGER update_stock 
AFTER UPDATE ON transaction
FOR EACH ROW
BEGIN
  IF NEW.transaction_status = 'cancel' THEN
    UPDATE transaction t
    JOIN transaction_details td ON td.transaction_id = NEW.transaction_id
    JOIN product p ON p.product_id = td.product_id
    SET p.product_stock = p.product_stock + td.qty;
  END IF;
END

Demo on dbfiddle

关于字段值改变时MySQL触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54433642/

相关文章:

database - 内存中的 H2 数据库,插入脚本不持久

python - 在 sqlalchemy 中触发

mysql - 如果另一个列值发生更改,如何创建 MySQL 触发器来更新日期时间列?

mysql - 将同一列中的两行相乘

MySQL - 获取最近的用户访问情况。仅显示用户一次

python - Mysql/python fetchall() 无法处理结果,因为它太大了

android.database.CursorIndexOutOfBoundsException : Index 0 requested, 大小为 0 数据库错误

android - 如何 : Provide notification to Android app whenever SQLite table updates

mysql - 如何在mysql中连续计算特定符号的数量

MySQL查询返回带有详细/重复信息的数据