2012-02-01 4 views
0

J'ai créé un déclencheur de mise à jour dans MySQL Community Server 5.5.16 mais quand j'essaie de mettre à jour l'instruction: Update Account set credit = 100 Where Number = 14001455; Je reçois une erreur "ERROR 1172 (42000): Résultat composé de plus d'un rangée". Je ne comprends pas pourquoi j'obtenir cette erreur et ce qui ne va pas avec mon code:MYSQL Trigger Update ne fonctionne pas comme supposé

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 ; 

Répondre

1

Je pense que votre problème est la déclaration: SELECT balance, credit, number INTO n_balance, n_credit, n_number FROM Account; - il renvoie probablement plus de 1 ligne, et donc MySQL ne peut pas charger les valeurs dans les variables que vous avez définies.

Vous ne savez pas à propos de votre intention, mais peut-être cherchez-vous les valeurs NEW. et OLD.?

2

Cette requête:

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

ne dispose pas d'une clause WHERE, de sorte que vous souhaitez sélectionnerez TOUS Account enregistrements dans variables, d'où vient le message d'erreur. La sélection en variables ne fonctionne que lorsque vous avez une seule ligne de résultat - avec plusieurs lignes, MySQL n'a aucun moyen de savoir quelle ligne vous voulez sortir du jeu de résultats. Il ne choisira pas pour vous.

1

L'initiale "sélection solde, crédit, numéro" renvoie plus d'une ligne.