插入后MySql触发器更新选择总和

Posted

技术标签:

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

我有三张桌子。

    成员 帐户 交易

在将新交易插入 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
        )

【问题讨论】:

【参考方案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,我无法更改权限。有没有其他方法可以用总和数据更新该字段?

以上是关于插入后MySql触发器更新选择总和的主要内容,如果未能解决你的问题,请参考以下文章

插入新行表1复制到表2选定字段后mysql触发器没有重复

MySQL触发器更新和插入操作

使用“之前”触发器插入后的 MySQL PDO LastInsertID 返回错误值

MySQL 触发器更新最后插入的行

Mysql触发器插入记录或更新,如果它已经存在? [复制]

MySQL 触发插入/更新事件