2012-10-19 3 views
1

J'ai une application PHP qui insère «Pass», «Fail» ou «NA» dans les champs TEST1, TEST2, TEST3 ... à TEST15.MySQL Update Trigger with Conditions

J'ai un champ appelé OVERALL qui doit être automatiquement mis à jour avec 'FAIL' si l'un des champs TEST1-TEST15 contient 'Fail'. Je suis assez sûr que j'ai besoin d'utiliser un déclencheur contenant l'instruction de mise à jour et CASE ou IF, mais je n'ai pas été en mesure d'établir la syntaxe exacte.

Quelqu'un peut-il s'il vous plaît aider un noob MySQL? J'utilise la version du serveur MySQL: 5.1.63-0 + squeeze1 (Debian).

Répondre

0

Vous pourriez probablement faire quelque chose comme

CREATE TRIGGER triggerName AFTER INSERT ON yourTable 
FOR EACH ROW BEGIN 
    IF NEW.yourColumn = 'Fail' THEN 
     UPDATE otherField set column = 'Fail' 
    END IF; 
END 

C'est ce qu'un tel déclencheur pourrait ressembler en théorie, mais je dois dire que je ne suis pas à 100% sur la syntaxe depuis sa fait un moment que je travaillé sur mysql.

Vous pouvez consulter le manuel pour plus d'infos sur la gâchette http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

+0

Ceci est très utile. Je vous remercie! Aurais-je besoin d'utiliser des instructions IF distinctes pour chaque colonne que je dois vérifier, ou existe-t-il une meilleure façon de le faire? –

+0

Si c'est toujours la même colonne, vous mettriez à jour, alors vous pouvez simplement vérifier toutes les colonnes avec OU. Par exemple: IF NEW.yourColumn = 'FAIL' ou NEW.otherColumn = 'FAIL', etc. J'espère que ce que je veux dire est clair. – mboldt

+0

Merci beaucoup de m'avoir aidé. Je pense que je suis proche! Je l'ai entré à l'invite mysql: 'délimiteur | CREER setoverall TRIGGER APRÈS LE INSERT TABLE_NAME POUR CHAQUE ROW BEGIN IF NEW.TEST1 = 'Fail' ALORS MISE A JOUR TABLE_NAME = ensemble global 'FAIL'; FIN SI; END; | délimiteur; ' MySQL ne se plaint pas, mais si j'insère de nouvelles données dans TABLE_NAME, la colonne OVERALL n'est pas mise à jour. D'autres indices? –

0

Ok ici est une autre TRIGGER vous pouvez essayer. Je l'ai testé et il doit remplacer le champ global par FAIL si la valeur de test1 ou test2 de la ligne insérée est FAIL. Il ne définira pas le champ global pour toute autre ligne à part celle que vous insérez.

Le code pour la TRIGGER:

DELIMITER | 

CREATE TRIGGER setoverall BEFORE INSERT ON table_name 
    FOR EACH ROW BEGIN 
    IF NEW.test1 = 'FAIL' OR NEW.test2 = 'FAIL' THEN 
     SET NEW.overall = 'FAIL'; 
    END IF; 
    END; 
| 

Tout ce que vous devez faire est de mettre dans le nom de la table correcte et vérifiez toutes les autres 13 tests colonnes que vous avez dans votre table si leur valeur est FAIL. J'espère que cela vous aide, si quelque chose n'est pas clair, faites le moi savoir.