Обновление триггера MYSQL не работает должным образом - PullRequest
0 голосов
/ 01 февраля 2012

Я создал триггер обновления в MySQL Community Server 5.5.16, но при попытке обновить оператор: Update Account set credit = 100 Where Number = 14001455; я получаю сообщение об ошибке «ОШИБКА 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 ]

2 голосов
/ 01 февраля 2012

Этот запрос:

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

нет предложения WHERE, поэтому вы будете выбирать ВСЕ Account записи в переменные, откуда и появляется сообщение об ошибке. Выбор в переменные работает только тогда, когда у вас есть одна строка результата - с несколькими строками MySQL не может узнать, какую строку вы хотите из набора результатов. Это не подойдет для вас.

1 голос
/ 01 февраля 2012

Я думаю, что ваша проблема в утверждении: SELECT balance, credit, number INTO n_balance, n_credit, n_number FROM Account; - он, вероятно, возвращает более 1 строки, и, следовательно, MySQL не может загрузить значения в определенные вами переменные.

Не уверены в своих намерениях, но, возможно, вы искали значения NEW. и OLD.?

1 голос
/ 01 февраля 2012

Первоначальный «выберите баланс, кредит, номер» возвращает более одной строки.

...