【问题标题】:MySQL Trigger not firing AFTER INSERTMySQL 触发器在插入后未触发
【发布时间】:2016-12-06 11:34:15
【问题描述】:

我在 MySQL 数据库中创建了一个新触发器,用于在插入后更新单元格值。我要更新的单元格 (gp_per) 默认设置为空值。

这里是触发器:

SET @gp_per = ((@retail_price - (@retail_price * 0.23)) - @cost_price) / (@retail_price * 0.23)

它创建得很好,我没有遇到任何语法错误,但是当我尝试插入新行时,gp_per 单元格会下降为 NULL,而不是使用正确的值进行更新。我以前没有真正使用过触发器,所以我不能 100% 确定我做错了什么。

下面是触发器:

以及表的结构:

感谢您的任何反馈!

【问题讨论】:

  • 您所做的是创建会话变量,它不会触及任何列值。在寻求帮助之前先阅读触发器如何?它们的语法很简单,如果你知道基本的 SQL 查询,你也可以处理触发器。

标签: mysql


【解决方案1】:

正如creating triggers 上的 MySQL 文档所说:

在触发器主体中,您可以使用别名 OLD 和 NEW 来引用主题表(与触发器关联的表)中的列。 OLD.col_name 在更新或删除之前引用现有行的列。 NEW.col_name 指的是要插入的新行的列或更新后的现有行。

trigger examples 上的 MySQL 文档仍然显示:

在 BEFORE 触发器中,如果您有 UPDATE 权限,您还可以使用 SET NEW.col_name = value 更改其值。这意味着您可以使用触发器来修改要插入新行或用于更新行的值。 (这样的 SET 语句在 AFTER 触发器中无效,因为行更改已经发生。)

以上表示你需要使用

SET NEW.gp_per=((NEW.retail_price - (NEW.retail_price * 0.23)) - NEW.cost_price) / (NEW.retail_price * 0.23)

表达式,您需要将触发器更改为 before 插入触发器。如果您的 MySQL 版本支持,您也可以考虑使用生成的列而不是触发器。

【讨论】:

    猜你喜欢
    • 2016-10-13
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多