【问题标题】:Trigger after insert doesn't fire for each row插入后触发器不会为每一行触发
【发布时间】:2013-01-31 14:25:22
【问题描述】:

嘿,我有一个在更新后触发的触发器,定义如下:

CREATE DEFINER =  `root`@`localhost` TRIGGER `logs_m` AFTER UPDATE ON  
`logs_month` FOR EACH ROW
 BEGIN IF NEW.status =1 THEN INSERT INTO logs_payments( direction, 
TYPE , amount, agent_id, invoice_number ) 
VALUES ( 0, 3, NEW.reward_minutes, NEW.agent_id, NULL ) ,
 ( 0, 5, NEW.credit, NEW.agent_id, NULL ) ;

END IF ;
END

现在在logs_payments 上,我在插入后有一个触发器,其定义如下:

CREATE DEFINER =  `root`@`localhost` TRIGGER `payments_invoice` BEFORE INSERT ON 
 `logs_payments` 
FOR EACH
ROW BEGIN 
IF NEW.direction =0
THEN 
SET NEW.invoice_number = ( SELECT MAX( IFNULL( invoice_number, 100000000 ) ) +1
FROM logs_payments l
WHERE l.direction =0 ) ;

END IF ;

IF NEW.direction =1 THEN SET NEW.invoice_number = 
( SELECT MAX( IFNULL( invoice_number, 200000000 ) ) +1
FROM logs_payments l
WHERE l.direction =1 ) ;

END IF ;

END

现在插入的第一行invoice_number 为空,第二行获得正确的值。

知道为什么会这样吗?

【问题讨论】:

  • 你为什么不用AUTO_INCREMENT
  • 因为该表还有其他值,而且我已经有一个 auto_incremented 列。并不是所有的列都应该有这个值。
  • 所以invoice_number 不是logs_payments 中的PK,但它被设计为既独特又不依赖于PK?听起来您可以对架构进行规范化。
  • 管理层是否曾改变主意? :) 更改架构成本太高,但非常感谢您的帮助!

标签: mysql sql triggers


【解决方案1】:

解决了,我的查询中有问题的触发器,因为我在第一次设置时没有价值:

SELECT MAX( IFNULL( invoice_number, 100000000 ) ) +1

应该是哪里错了

select ifnull(max(invoice_number),100000000)+1

现在它可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多