MYSQL触发器更新无法正常工作

时间:2012-02-01 14:15:34

标签: mysql function triggers match

我在MySQL社区服务器5.5.16中创建了一个更新触发器但是当我尝试更新语句时:Update Account set credit = 100 Where Number = 14001455;我收到错误“ERROR 1172(42000):结果由多行组成”。我不明白为什么我会收到此错误以及我的代码出了什么问题:

delimiter |
CREATE TRIGGER t_creditexceed AFTER UPDATE ON Account
FOR EACH ROW
BEGIN 
    DECLARE n_overdraft INTEGER;
    DECLARE n_balance INTEGER;
    DECLARE n_number INTEGER;
    DECLARE n_credit INTEGER;
    DECLARE credit_exception condition for SQLSTATE '07030';

    SELECT balance, credit, number INTO n_balance, n_credit, n_number
    FROM Account;
    IF ((n_balance < (-n_credit)) AND (n_balance >= 1.1 * (-n_credit)))
    THEN
    SET n_overdraft = n_balance + n_credit;
    INSERT INTO overdraft (account_no, over_draft) VALUES (n_number, n_overdraft);
    END IF;
    IF (n_balance < 1.1 *(- n_credit))
    THEN signal credit_exception;
    END IF;
END;
|
delimiter ;

3 个答案:

答案 0 :(得分:2)

此查询:

SELECT balance, credit, number INTO n_balance, n_credit, n_number
FROM Account;

没有WHERE子句,因此您将选择所有Account个记录到变量中,这是错误消息的来源。只有当你有一个结果行时才选择输入变量 - 有多行,MySQL无法知道你想要从结果集中选择哪一行。它不会为你挑选。

答案 1 :(得分:1)

最初的“选择余额,信用,数字”返回多行。

答案 2 :(得分:1)

我认为您的问题是声明:SELECT balance, credit, number INTO n_balance, n_credit, n_number FROM Account; - 它可能返回超过1行,因此MySQL无法将值加载到您定义的变量中。

不确定您的意图,但也许您正在寻找NEW.OLD.值?