插入后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 演示。
更新:由于您无法使用触发器,请尝试将 INSERT
和 UPDATE
包装到这样的存储过程中
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触发器更新选择总和的主要内容,如果未能解决你的问题,请参考以下文章