在MySQL中将新的行插入表(触发器问题)时有选择地更新旧行

时间:2014-05-22 15:33:02

标签: mysql sql triggers sql-update sql-insert

我今天在MySQL数据库中设计触发器语句时遇到了一个小问题:

我们有以下相关表格:

  • quote(quote_key,date,discount_rate,discount_period,supplier_key)
  • part(part_key,part_name,...)
  • part_quote(pq_key,part_price,fk_quote_key,fk_part_key)
  • part_approval(papproval_key,is_approved,fk_part_quote_key)

现在解释逻辑:

每个供应商都会针对制造过程中的不同输入(例如零件和组件)发出报价。如果零件的价格是正确的,它们将被批准用于制造,因此可以由我们的工程师使用。由于我们希望能够接收来自不同供应商的相同部件的报价以进行比较,因此我尝试使用part_quote和part_approval表对此过程进行建模。

关于我的问题:如果我想批准新的part_quote,我希望BOOL标志" is_approved"在所有(或最近的)旧引号中自动设置为FALSE。

我尝试通过发出触发器语句来完成此操作:      在INSERT ON part_approval之前创建TRIGGER update_approval      对于每一行--- ??

我在选择要更新的正确行时遇到一些问题:

  1. 如何选择part_key,最终识别需要更新的所有相关行?
  2. 如何仅选择旧(或最近)的行?
  3. 我本来希望包括一个筛选器,但不幸的是,我还没有10reps:/

    非常感谢你, 祝一切顺利, 的Marius

2 个答案:

答案 0 :(得分:0)

首先,我将尽我所能回答您的问题,因为了解有关如何使用触发器的更多信息会很有帮助。然后我将解释为什么你不应该实际使用触发器。

触发器提供对两个特殊别名的访问权限,这两个特殊别名无法使用:OLD和NEW。 NEW允许您访问新值并在更新/插入触发器中工作。 OLD允许您访问旧值并在更新/删除触发器中工作。

对于你的情况,你可能想要这样的东西:

CREATE TRIGGER `update_approval` BEFORE INSERT ON `part_approval`
FOR EACH ROW
UPDATE `table_x` SET `value` = y WHERE `z` = NEW.a;

有关触发器的更多信息和一些有用的示例,我建议您阅读:http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

但是,MySQL中的触发器无法更新触发它们的同一个表,这就是您要做的事情。有人在这里提出了一个很好的问题:MySQL - Trigger for updating same table after insert并且在这种情况下你应该使用存储过程这是一个很好的答案。

答案 1 :(得分:0)

我不确定这会完全解决我的问题,但根据您的建议,我遇到了几个有用的帖子,这些帖子能够在多个语句的触发器中实现类似的更新。

CREATE TRIGGER update_approval BEFORE INSERT ON part_approval
FOR EACH ROW BEGIN 
DECLARE part_id INT;
    SELECT part_key INTO part_id
    FROM part p, part_quote pq, part_approval a 
    WHERE NEW.part_quote_key=pq.part_quote_key AND pq.part_key = p.part_key;
UPDATE part p, part_quote pq, part_approval a 
    SET a.is_approved=DEFAULT 
    WHERE pq.part_key=part_id AND a.approval_date<NEW.approval_date;
END;

只能在数据库填充后的星期一试用。 谢谢你的帮助!