2014-12-02 277 views
0

您好我试图为一个SQL触发器声明一些用户定义的变量(EX:@var),该值为给定的用户ID在所选行中求和。但是,我在我的DECLARE语句中收到语法错误。MySQL触发器用户声明的变量

这里是我的代码:

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 ; 

^这将返回一个错误 “在 '字段列表' 未知列 '行动'”。

action,share和viral都是表subscribers_points中的列名,所以我不确定它为什么会返回这个错误。

回答

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 ; 

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

+0

为什么选择BEFORE?如果更新了这些值中的任何一个,则需要将它们添加到更新后的总量中。为了便于使用,我使用了上面的查询,当我更新表中的一个Item时,触发器给了我这个错误:“无法更新存储的函数/触发器中的表'subscribers_points',因为它已被语句使用它调用了这个存储的函数/触发器。“想法? – wUmpage 2014-12-02 21:32:39

+0

您想要一个'BEFORE'触发器,以便同时更新所有列。我不知道为什么我在触发器中保留'update'。这是导致问题的开始。你只需要设置'new.total_points'。 – 2014-12-02 21:41:41

+0

显然“在存储的函数或触发器中,不允许修改已调用该函数或触发器的语句(用于读取或写入)的表格,当触发器触发时它可能会锁定表格。”所以我现在甚至不知道如何调用这个触发器。 – wUmpage 2014-12-02 21:41:56