【问题标题】:MySQL Trigger User Declared VariablesMySQL 触发用户声明的变量
【发布时间】:2014-12-02 20:49:10
【问题描述】:

您好,我正在尝试为一个 SQL 触发器声明一些用户定义的变量(EX:@var),该触发器对给定订阅者 ID 的选定行中的值求和。但是,我的 DECLARE 语句出现语法错误。

这是我的代码:

    DELIMITER //
    CREATE TRIGGER trg_subscribers_points

    AFTER UPDATE ON subscribers_points FOR EACH ROW
    BEGIN

    DECLARE @Sub_ID bigint, @Col1 bigint, @Col2 bigint, @Col3 bigint

    (select @Sub_ID = subscriber_id, @Col1 = action, @Col2 = share, @Col3 = viral FROM subscribers_points)

    update subscribers_points set total_points = @Col1 + @Col2 + @Col3 where subscriber_id = @Sub_ID

    END//

DELIMITER ;

建议?提前致谢。

更新代码:

DELIMITER //

CREATE TRIGGER trg_subscribers_points

BEFORE UPDATE 
ON subscribers_points 
FOR EACH ROW

BEGIN

SET NEW.total_points = (action + share + viral);

END//
DELIMITER ;

^这会返回一个“‘字段列表’中的未知列‘操作’”错误。

操作、分享和病毒都是表subscribers_points 中的列名,所以我不确定它为什么会返回此错误。

【问题讨论】:

    标签: mysql syntax triggers declare


    【解决方案1】:

    我不确定您的错误是什么,但您不需要为此目的的变量。你有几个问题。一方面,您不应该在更新后再次更新该行。而且,您的触发器实际上并不引用正在更改的数据。我怀疑你想要这样的东西:

    DELIMITER //
    CREATE TRIGGER trg_subscribers_points
    BEFORE UPDATE ON subscribers_points FOR EACH ROW
    BEGIN
        set new.total_points = (new.action + new.share + new.viral)
    END//
    
    DELIMITER ;
    

    请注意,触发器已更改为“更新前”触发器。

    【讨论】:

    • 为什么之前?如果更新了这些值中的任何一个,则需要在更新后将它们添加到总金额中。为了便于使用,我使用了上面的查询,当我更新表中的项目时,触发器给了我这个错误:“无法在存储的函数/触发器中更新表'subscribers_points',因为它已经被语句使用它调用了这个存储的函数/触发器。”想法?
    • 您需要一个BEFORE 触发器,以便同时更新所有列。我不知道为什么我在触发器中留下了update。那是导致问题开始的原因。你只需要设置new.total_points
    • 显然“在存储的函数或触发器中,不允许修改已被调用函数或触发器的语句使用(用于读取或写入)的表。当触发器触发它时可能会锁定桌子。”所以我现在什至不确定如何调用这个触发器。
    • Gordon 感谢您到目前为止的帮助,我更新了我的代码。触发器不再循环,但由于某种原因它找不到要添加的列值。请在上面查看我的编辑。
    • @wUmpage 。 . .至少我知道当我离开update 时我在想什么。您需要将new. 用于列的新值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多