2010-05-19 10 views
3

Tenir compte des deux tables (hypothétiques) suivantesdéclencheur SQLite mise à jour Résumé Compte

Température

* day 
* time 
* lake_name 
* station 
* temperature_f 

Temperature_summary

* day 
* lake_name 
* station 
* count_readings_over_75f 
* count_readings_below_75f 

Comment puis-je écrire un SQLite Trigger de mettre à jour le temperature_summary table sur l'insertion. Je veux incrémenter le compte.

Merci, Jeff

+0

Comment est-ce lié à ruby? Cherchez-vous l'implémentation de sql uniquement ou dans votre application ruby? – Zepplock

+0

Oups. C'est une habitude de marquer mes questions en tant que rubis. Je l'utilise beaucoup. Fixé maintenant – jrhicks

Répondre

6

Cela suppose que vous avez déjà créé le record du jour/lake_name/station avant d'insérer des températures ce jour-là. Bien sûr, vous pouvez ajouter un autre déclencheur pour le faire.

create trigger Temperature_count_insert_trigger_hi after insert on Temperature 
    when new.temperature_f >= 75 
    begin 
    update Temperature_summary set count_readings_over_75f = count_readings_over_75f + 1 
    where new.day = day and new.lake_name = lake_name and new.station = station; 
    end; 

create trigger Temperature_count_insert_trigger_lo after insert on Temperature 
    when new.temperature_f < 75 
    begin 
    update Temperature_summary set count_readings_below_75f = count_readings_below_75f + 1 
    where new.day = day and new.lake_name = lake_name and new.station = station; 
    end; 

Vous pouvez combiner en un déclencheur légèrement plus complexe

create trigger Temperature_count_insert_trigger after insert on Temperature 
    begin 
    update Temperature_summary 
    set count_readings_below_75f = count_readings_below_75f + (new.temperature_f < 75), 
     count_readings_over_75f = count_readings_over_75f + (new.temperature_f >= 75) 
    where new.day = day and new.lake_name = lake_name and new.station = station; 
    end; 

Pour assurer qu'il ya une ligne de Temperature_summary mettre à jour (a) faire un index unique sur (day, lake_name, station) de Temperature_summary, ou faire ces colonnes la clé primaire, et (b) faire un insert ou d'ignorer dans la détente comme ceci:

create trigger Temperature_count_insert_trigger after insert on Temperature 
    begin 
    insert or ignore into Temperature_summary 
     values (new.day, new.lake_name, new.station, 0, 0); 
    update Temperature_summary 
    set count_readings_below_75f = count_readings_below_75f + (new.temperature_f < 75), 
     count_readings_over_75f = count_readings_over_75f + (new.temperature_f >= 75) 
    where new.day = day and new.lake_name = lake_name and new.station = station; 
    end; 
+0

Comment gérer le paramètre temperature_f <= 75, dois-je ajouter un autre déclencheur ou puis-je ajouter une autre instruction when. Merci! – jrhicks

+0

La deuxième option ci-dessus gère les deux cas (ci-dessus et ci-dessous) dans un déclencheur. –

+0

Cela suppose que j'ai un enregistrement à mettre à jour, et si je n'ai pas d'enregistrement à mettre à jour. Je vais devoir commander les déclencheurs et faire un insert? Des idées? – jrhicks

0

un déclencheur peut être créé pour mettre à jour les compteurs chanter dans un le déclencheur. Cela améliorera sans doute les performances et collectera les éléments associés dans un seul emplacement.

create trigger Temperature_count_insert_trigger_lo after insert on Temperature begin 
    update Temperature_summary set Temperature_summary set count_readings_over_75f = count_readings_over_75f + (new.temperature_f >= 75), count_readings_below_75f = count_readings_below_75f + (new.temperature_f < 75) 
    where new.day = day and new.lake_name = lake_name and new.station = station; end; 

Il peut être nécessaire d'inclure le traitement du déclencheur pour les mises à jour dans la table de températures si celles-ci peuvent se produire.

Questions connexes