MYSQL创建一个触发器来汇总插入和更新的总金额



我正在使用MYSQL 6.0工作台来创建我的触发器。

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

表 = Inventory_maintenance(oil_change、制动器、皮带、其他、总计)所有值均为双精度值。 我的表当前为空,正在等待数据。

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

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**

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

AFTER触发器仅在

DML 操作完成后触发。NEW的范围将一直持续到 DML 操作完成为止。

请参考:触发器启动后;不能更改任何值...

    插入执行,值为
  1. NEW 行;数据将写入表中

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

  3. 控制权将返回到应用程序

如果确实要在新行中设置列的值,请使用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 ;
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 ;

标签"新建"不能在插入触发器后使用。

最新更新