MYSQL创建一个触发器来总计插入和更新的总量

时间:2014-01-04 19:08:25

标签: mysql triggers sum mysql-workbench

我正在使用MYSQL 6.0 Workbench来创建触发器。

我有一张桌子,用于存放车辆维修费用。我想创建一个触发器,在更新和插入列时,它将汇总所有值并使用计算的总和填充已存在的TOTAL列。我希望这些值存储在表中而不是运行查询。

table = Inventory_maintenance(换油,刹车,皮带,其他,总计) 所有值都是双倍的。我的表目前是空的,等待数据。

这是我到目前为止尝试过的触发器:

USE `car_db`;

DELIMITER $$

CREATE TRIGGER `inventory_maintenance_AINS`
                AFTER INSERT ON `inventory_maintenance`
FOR EACH ROW
BEGIN
  SET inventory_maintenance.TOTAL =
          inventory_maintenance.OIL_CHANGE
        + inventory_maintenance.BELTS
        + inventory_maintenance.BRAKES
        + inventory_maintenance.OTHER ;
END#

错误

ERROR 1193: Unknown system variable 'TOTAL'
ERROR: Error when running failback script. Details follow.
ERROR 1050: Table 'inventory_maintenance' already exists**

和.....

USE `car_db`;

DELIMITER $$

CREATE TRIGGER `inventory_maintenance_AINS`
               AFTER INSERT ON `inventory_maintenance`
FOR EACH ROW
BEGIN
  SET NEW.TOTAL = NEW.OIL_CHANGE + NEW.BELTS + NEW.BRAKES + NEW.OTHER; 
END#

错误

ERROR 1362: Updating of NEW row is not allowed in after trigger
ERROR: Error when running failback script. Details follow.
ERROR 1050: Table 'inventory_maintenance' already exists**

我哪里错了?原谅我,但我是触发器的新手。

2 个答案:

答案 0 :(得分:0)

在完成DML操作后,AFTER触发器仅触发NEW的范围将一直持续到DML操作完成。

请参阅:AFTER triggers start; no values can be altered...

  
      
  1. Insert以NEW行的值执行;数据写入表

  2.   
  3. AFTER触发器启动;没有值可以更改,因为它们已经写入表中,但是可以从触发器执行其他操作,例如在其他表中插入/更新/删除行

  4.   
  5. 控制权返回给应用程序

  6.   

如果您确实要在新行中设置列的值,请使用BEFORE触发器 以下应该是有效的。

DELIMITER $$

CREATE TRIGGER `inventory_maintenance_BINS`
               BEFORE INSERT ON `inventory_maintenance`
FOR EACH ROW
BEGIN
  SET NEW.TOTAL = NEW.OIL_CHANGE + NEW.BELTS + NEW.BRAKES + NEW.OTHER; 
END#

$$

DELIMITER ;

答案 1 :(得分:0)

DELIMITER $$

CREATE TRIGGER `inventory_maintenance_BINS`
               BEFORE INSERT ON `inventory_maintenance`
FOR EACH ROW
BEGIN
  SET NEW.TOTAL = NEW.OIL_CHANGE + NEW.BELTS + NEW.BRAKES + NEW.OTHER; 
END#

$$

DELIMITER ;

或者你可以试试这个:

DELIMITER $$

CREATE TRIGGER `inventory_maintenance_BINS`
               AFTER INSERT ON `inventory_maintenance`
FOR EACH ROW
BEGIN
  SET inventory_maintenance.TOTAL = inventory_maintenance.OIL_CHANGE + inventory_maintenance.BELTS + inventory_maintenance.BRAKES + inventory_maintenance.OTHER; 
END#

$$

DELIMITER ;

插入触发后,不能使用标签“新建”。