我正在使用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**
我哪里错了?原谅我,但我是触发器的新手。
答案 0 :(得分:0)
在完成DML操作后,AFTER
触发器仅触发。 NEW
的范围将一直持续到DML操作完成。
请参阅:AFTER triggers start; no values can be altered...
Insert以NEW行的值执行;数据写入表。
AFTER触发器启动;没有值可以更改,因为它们已经写入表中,但是可以从触发器执行其他操作,例如在其他表中插入/更新/删除行。
- 醇>
控制权返回给应用程序。
如果您确实要在新行中设置列的值,请使用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 ;
插入触发后,不能使用标签“新建”。