需要触发器的帮助php/mySQL
问题描述:
我需要使用三个表使这个触发器工作。有没有人看到问题?需要触发器的帮助php/mySQL
'数量'需要始终显示添加和拉动的最新数量。
CREATE TRIGGER Upd_Cartons_Qty
AFTER INSERT ON cartons_added FOR EACH ROW
BEGIN
UPDATE cartons_current SET qty = qty + NEW.add_qty WHERE part_no = NEW.part_no;
END;
TABLE NAME: cartons_current
+--------------+--------------+-------+-------+
| Column | Type | Null | Key |
+--------------+--------------+-------+-------+
| part_no | varchar(20) | No | Prim |
| qty | int(8) | No | |
+--------------+--------------+-------+-------+
TABLE NAME: cartons-added
+--------------+--------------+-------+-------+
| Column | Type | Null | Key |
+--------------+--------------+-------+-------+
| part_no | varchar(20) | No | Prim |
| add_qty | int(8) | No | |
+--------------+--------------+-------+-------+
TABLE NAME: cartons_pulled
+--------------+--------------+-------+-------+
| Column | Type | Null | Key |
+--------------+--------------+-------+-------+
| part_no | varchar(20) | No | Prim |
| pull_qty | int(8) | No | |
+--------------+--------------+-------+-------+
答
1-您不能使用;
作为end
最后的分隔符。您需要在触发器之前设置分隔符。
2-A after insert
触发器逻辑上应该有一个前缀ai
,而不是upd
。
3-您不能在触发器所在的表中更改after
触发器中的值。因此,如果您(可能)需要更改cartons_added
中的值,则需要在before
触发器中执行此操作。另一方面,您不能更改before
触发器中的其他表中的值,因为这些更改可能会回滚,然后您在表中发生不稳定情况,因此需要在after
触发器中发生。
5-您可以在触发器中生成多个表格,只需按照示例进行操作即可。
DELIMITER $$
CREATE TRIGGER ai_Cartons_Qty AFTER INSERT ON cartons_added FOR EACH ROW
BEGIN
UPDATE cartons_current SET qty = qty + NEW.add_qty WHERE part_no = NEW.part_no;
UPDATE cartons_pulled SET x1 = x1 + NEW.add_qty WHERE part_no = NEW.part_no;
END$$
DELIMITER ;
如果你想改变的触发一定的价值自己的表,不使用update
,使用代码类似下面代替:
DELIMITER $$
CREATE TRIGGER ai_Cartons_Qty BEFORE INSERT ON cartons_added FOR EACH ROW
BEGIN
-- Update cartons_added .... will not work.
-- Use SET NEW.fieldname instead.
IF NEW.qty_added = 0 THEN
SET NEW.qty_added = 1;
END IF;
END$$
DELIMITER ;
我是否需要添加触发器为每个表或只一次?我在哪里放置触发器? – Erik
@Erik,你需要给每个表添加一个触发器。只需运行这些命令,MySQL会将触发器附加到表中,就像MySQL在创建表时将表附加到数据库一样。 – Johan
我真的很感谢你的帮助。它很棒!上帝保佑。 – Erik