插入更新后创建触发器

时间:2015-11-25 17:16:16

标签: mysql triggers sql-update

我有一个带有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尚未支持多个触发器,并且一个表具有相同的操作时间和事件'

1 个答案:

答案 0 :(得分:2)

你的触发器在几个方面都是错误的:

  1. SQL Server没有for each row选项
  2. 您需要定义此触发器
  3. 表格
  4. 触发器将为语句触发一次,但该语句可能插入(或更新)多行,您需要处理该
  5. 所以你的触发器应该是这样的:

    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伪表中可用(其结构与触发器附加的表完全相同) - 您可以从触发器中的该表中获取有关这些行的信息。

    对于UPDATEDeleted伪表将包含旧值(在UPDATE之前),而Inserted伪表将包含新值(在UPDATE之后) - 因此您可以在AFTER UPDATE触发器中使用这两组值。

    阅读CREATE TRIGGER命令in the freely available MSDN SQL Server Books Online documentation中各种选项的所有详细信息始终应该是您第一个去寻找SQL的地方特定于服务器的帮助