我可以在触发器的SELECT INTO语句中使用SUM()吗?

时间:2014-04-25 22:18:24

标签: mysql sql stored-procedures triggers

我想取相同外键的每个账单金额的总和。如果总和小于零,我想更新fk表中的枚举字段。我无法在SELECT INTO中找到任何关于使用sum()的内容,但如果它有用的话会很棒。

CREATE TRIGGER `bill_log_after_insert` AFTER INSERT ON `bill_log` 
FOR EACH ROW 
  DECLARE @amount DECIMAL;
  SELECT 
    SUM(`bill_amount`) 
  INTO 
    @amount 
  FROM
    `bill_log`
  WHERE 
    `main_fk` = NEW.`main_fk`; 
  IF @amount < 0 THEN 
    UPDATE `main` SET `transaction_type` = 'credit' WHERE `main_pk` = NEW.`main_fk`; 
  END IF;

1 个答案:

答案 0 :(得分:2)

SUM语句中使用SELECT INTO有效。但是你的触发器存在一些其他问题:

如果你想要DECLARE一个局部变量,你不能在它前面添加一个@ - 符号,就像会话变量所需要的那样。局部变量的范围仅在触发器内部,而不是当前会话的全局范围,因为它是会话变量的范围。优良作法是为局部变量(带v)添加前缀,以区别于查询中的非限定字段名称,因为相同的名称可能会导致错误或至少出现意外行为。

此外,您需要在DECIMAL时指定DECLARE字段或变量的精度。默认值为DECIMAL(10,0)。这意味着该数字可以是10位数,并且没有小数位。如果您将其设置为DECIMAL(8, 2),即该数字可以是8位数字,但其中2位是小数位。

DELIMITER //

CREATE TRIGGER bill_log_after_insert AFTER INSERT ON bill_log
FOR EACH ROW
    BEGIN
    DECLARE v_amount DECIMAL(8, 2);

    SELECT SUM(bill_amount)
        INTO v_amount
        FROM bill_log
        WHERE main_fk = NEW.main_fk;

    IF v_amount < 0 THEN
        UPDATE main SET transaction_type = 'credit' WHERE main_pk = NEW.main_fk;
    END IF;
    END //

DELIMITER ;

DEMO @ SQL Fiddle