我想取相同外键的每个账单金额的总和。如果总和小于零,我想更新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;
答案 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