【问题标题】:MySql Trigger Update select sum after insert插入后MySql触发器更新选择总和
【发布时间】:2013-05-24 01:27:36
【问题描述】:

我有三张桌子。

  1. 成员
  2. 帐户
  3. 交易

在将新交易插入 Transactions 表后,我想用所有 Transactions.TransactionAmount 的总和来更新 Accounts.AccountBalance。

以下代码似乎对我不起作用。有什么建议吗?

CREATE TRIGGER NewTrigger
    AFTER INSERT ON Transactions
    FOR EACH ROW 
    BEGIN
        UPDATE Accounts SET Accounts.AccountBalance = (
                SELECT SUM(Transactions.TransactionAmount) 
                    FROM Transactions
                    WHERE Accounts.AccountID=Transactions.AccountID
        )

【问题讨论】:

    标签: mysql select triggers sum


    【解决方案1】:

    试试

    CREATE TRIGGER NewTrigger 
    AFTER INSERT ON Transactions
    FOR EACH ROW
    UPDATE Accounts a
       SET a.AccountBalance = 
        (SELECT SUM(TransactionAmount) 
           FROM Transactions
          WHERE AccountID = a.AccountID)
     WHERE a.AccountID = NEW.AccountID;
    

    这里是 SQLFiddle 演示。

    更新:由于您无法使用触发器,请尝试将 INSERTUPDATE 包装到这样的存储过程中

    DELIMITER $$
    CREATE PROCEDURE AddTransaction(IN aid INT, amount DECIMAL(11, 2)) 
    BEGIN
      START TRANSACTION;
      INSERT INTO Transactions (AccountID, TransactionAmount)
      VALUES (aid, amount);
      UPDATE Accounts a
         SET a.AccountBalance = 
          (SELECT SUM(TransactionAmount) 
             FROM Transactions
            WHERE AccountID = a.AccountID)
       WHERE a.AccountID = aid;
       COMMIT;
    END $$
    DELIMITER ;
    

    然后使用它

    CALL AddTransaction(1, 10.50);
    

    这是该场景的 SQLFiddle 演示。

    【讨论】:

    • 不走运。错误 SQL 查询: CREATE TRIGGER NewTrigger AFTER INSERT ON Transactions FOR EACH ROW BEGIN UPDATE Accounts a SET a.AccountBalance = ( SELECT SUM( TransactionAmount ) FROM Transactions WHERE AccountID = a.AccountID ) WHERE a.AccountID = NEW.AccountID MySQL 说:# 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 9 行的 '' 附近使用
    • @MarcusReed 不需要BEGIN。查看更新的答案和 sqlfiddle 演示。
    • MySQL 说:#1227 - 访问被拒绝;您需要此操作的 SUPER 权限
    • @MarcusReed 在 MySQL 5.0 中 CREATE TRIGGER 需要 SUPER 权限。因此,要么为您创建触发器的当前用户授予所需的权限,要么在超级用户(通常是 root)帐户下进行
    • 我正在使用godaddy phpmyadmin,我无法更改权限。有没有其他方法可以用总和数据更新该字段?
    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2016-06-27
    • 2019-11-15
    • 2021-03-08
    • 2014-09-23
    相关资源
    最近更新 更多