2012-02-01 10 views
0

MySQL Community Server 5.5.16でアップデートトリガを作成しましたが、文を更新しようとしました:Update Account set credit = 100 Where Number = 14001455;エラー "ERROR 1172(42000):複数の行"。MYSQLトリガアップデートが正常に動作しない

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 ; 

答えて

1

あなたの問題は、SELECT balance, credit, number INTO n_balance, n_credit, n_number FROM Account;というステートメントです - おそらく1行以上を返し、MySQLは定義した変数に値をロードできません。

あなたの意図はわかりませんが、NEW.OLD.の値を探していた可能性がありますか?

2

このクエリは:私はこのエラーを取得し、私のコードの何が問題なのですなぜ私は理解していないあなたにALL Accountレコードを選択すると思いますので、

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

は、WHERE句を持っていません。エラーメッセージが出てくる変数です。変数を選択するのは、複数の行を持つ単一の結果行がある場合にのみ機能し、MySQLは結果セットからどの行を使用するかを知る方法がありません。それはあなたのために選ぶことはありません。

1

最初の「選択残高、クレジット、番号」は複数の行を返しています。