【问题标题】:MYSQL Trigger Error,MYSQL 触发错误,
【发布时间】:2015-02-28 09:18:11
【问题描述】:

我正在尝试创建一个非常简单的 MySQL 触发器,它将在插入或更新一个表(螺丝)上的一行时运行。我以为我已经很接近了,但是当我运行查询来创建触发器时,它只是失败并说错误,没有什么可以为我指明正确的方向。

这是我到目前为止所拥有的,我只是想获取表中两列的值并将它们相乘,然后将结果更新到第三列,我希望每当添加新记录时都会发生这种情况或在此表中进行了编辑。我已经尝试匹配我所见过的一些示例,但似乎没有什么能完全匹配。

delimiter //
CREATE TRIGGER estimate
AFTER INSERT ON `Screws` FOR EACH ROW
begin
UPDATE Screws SET Quantity = Weight * num_per_ounce;
end;
delimiter ;

【问题讨论】:

  • 在你的标题中你写了一个错误,错误是什么?它有消息和/或号码吗?
  • 感谢 hakre 的回复,该错误除了“错误”之外没有其他信息。这也是我发帖的部分原因。

标签: php mysql triggers phpmyadmin


【解决方案1】:

好的,我会为遇到类似问题的其他人发布我的最终解决方案。

原来我忘记更改另一个触发器中的触发器操作,所以我现在都可以正常工作。这是我的最终代码,如果在它检查的两个字段中没有数据输入,我添加了一个检查以防止它运行。

CREATE TRIGGER screws_insert
BEFORE INSERT ON `Screws` FOR EACH ROW
begin
IF new.Weight AND new.num_per_ounce IS NOT NULL THEN
    SET new.Quantity = new.Weight * new.num_per_ounce;
END IF;
end;

CREATE TRIGGER screws_update
BEFORE UPDATE ON `Screws` FOR EACH ROW
begin
IF new.Weight AND new.num_per_ounce IS NOT NULL THEN
    SET new.Quantity = new.Weight * new.num_per_ounce;
END IF;
end;

确保在运行 SQL 之前将分隔符设置为 //。 感谢为此解决方案做出贡献的两位用户!

【讨论】:

    【解决方案2】:

    如果要更改插入行的同一个表,则不要使用 after 插入触发器。而是使用 before 插入触发器:

    delimiter //
    CREATE TRIGGER screws_insert
    BEFORE INSERT ON `Screws` FOR EACH ROW
    begin
        SET new.Quantity = new.Weight * new.num_per_ounce;
    end;
    delimiter ;
    

    您实际上是在尝试添加 MySQL 不直接支持的计算列。

    如果您还想要update 的触发器,那么您需要两个触发器:

    delimiter //
    CREATE TRIGGER screws_update
    BEFORE UPDATE ON `Screws` FOR EACH ROW
    begin
        SET new.Quantity = new.Weight * new.num_per_ounce;
    end;
    delimiter ;
    

    请注意,我更改了触发器名称以包含该表。这通常是帮助跟踪触发器的好习惯。

    【讨论】:

    • 谢谢你,Gordon,你的解释很清楚,我会尽快尝试实现它。附带说明一下,我已经有一段时间没有来这里了,但是点赞按钮在哪里?
    • 快速更新,我能够使第一条语句正常工作,但似乎我拥有的 MySQL 版本不允许我为相同的事情有多个触发器,所以我想我在这种方式上受到限制除非我可以将其设置为在 UPDATE 或 INSERT 上运行,否则我认为这在我的快速试用中不会起作用。也许使用 CHANGE 而不是 UPDATE 或 INSERT 会导致所需的行为?
    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多