我有一个带有bal_load int列的配置文件表。 我还有2个表,即债务和支付金额列。 我需要在向债务插入一个值之后触发,将插入债务时添加profile.bal_load'当前值,同时减去插入是否来自付款。
个人资料表
+--+--------+
|ID|BAL_LOAD|
+--+--------+
|1 |500 |
|2 |300 |
+--+--------+
如果这样的插页会发生在债务表中,
债务
+--+----------+------+
|ID|PROFILE_ID|AMOUNT|
+--+----------+------+
|1 |1 |20 |
+--+----------+------+
然后触发器应该添加bal_load和债务金额。
PROFILE
+--+--------+
|ID|BAL_LOAD|
+--+--------+
|1 |520 | -->500+20
|2 |300 |
+--+--------+
如果在付款方式中出现这样的插页,
PAYMENT
+--+----------+------+
|ID|PROFILE_ID|AMOUNT|
+--+----------+------+
|1 |2 |220 |
+--+----------+------+
然后触发器应该用付款金额减去bal_load。
PROFILE
+--+--------+
|ID|BAL_LOAD|
+--+--------+
|1 |520 |
|2 |80 | -->300-220
+--+--------+
这是我插入债务金额的憔悴触发器
create trigger bal_load_debt after insert on debt
for each row
begin
update profile
set bal_load = bal_load + amount
where profile.id = debt.profile_id;
end
并插入付款金额
create trigger bal_load_payment after insert on payment
for each row
begin
update profile
set bal_load = bal_load + amount
where profile.id = payment.profile_id;
end
请帮助:)
为了更新,我使用了这个
CREATE TRIGGER bal_load_debt
AFTER INSERT
ON debt
FOR EACH ROW
UPDATE Profile
SET bal_load = bal_load + NEW.amount
WHERE profile.id = debt.profile_id
我收到此错误消息
1235 - 此版本的MySQL尚未支持多个触发器,并且一个表具有相同的操作时间和事件'
答案 0 :(得分:2)
你的触发器在几个方面都是错误的:
for each row
选项所以你的触发器应该是这样的:
CREATE TRIGGER bal_load_debt
ON dbo.Debt
AFTER INSERT
AS
UPDATE dbo.Profile
SET bal_load = bal_load + SUM(i.amount)
FROM Inserted i -- newly inserted rows
WHERE Profile.id = i.profile_id;
新插入的行(可以多个!)在Inserted
伪表中可用(其结构与触发器附加的表完全相同) - 您可以从触发器中的该表中获取有关这些行的信息。
对于UPDATE
,Deleted
伪表将包含旧值(在UPDATE
之前),而Inserted
伪表将包含新值(在UPDATE
之后) - 因此您可以在AFTER UPDATE
触发器中使用这两组值。
阅读CREATE TRIGGER
命令in the freely available MSDN SQL Server Books Online documentation中各种选项的所有详细信息,始终应该是您第一个去寻找SQL的地方特定于服务器的帮助