我需要使用三个表来使这个触发器工作。有没有人看到问题?
'qty'需要始终显示添加和拉取的最新数量。
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 | |
+--------------+--------------+-------+-------+
答案 0 :(得分:0)
1-您无法使用;
作为end
的最终分隔符。您需要在触发器之前设置分隔符
2- A after insert
触发器在逻辑上应该具有前缀ai
,而不是upd
3-您无法在触发器所在的同一个表中更改after
触发器中的值。因此,如果您(可能)需要更改cartons_added
中的值,则需要在before
触发器中执行此操作。
4-另一方面,您无法更改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 ;