需要帮助来触发php / mySQL

时间:2011-09-26 20:18:43

标签: php mysql triggers

我需要使用三个表来使这个触发器工作。有没有人看到问题?

'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    |       |
+--------------+--------------+-------+-------+

1 个答案:

答案 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 ;