Триггер SQLite для обновления итоговых показателей - PullRequest
3 голосов
/ 20 мая 2010

Рассмотрим следующие две (гипотетические) таблицы

Температура

* day
* time
* lake_name
* station
* temperature_f

Temperature_summary

* day
* lake_name
* station
* count_readings_over_75f
* count_readings_below_75f

Как мне написать SQLite Триггер для обновления таблицы Temperature_summary при вставке. Я хочу увеличить счет.

Спасибо, Джефф

Ответы [ 2 ]

6 голосов
/ 20 мая 2010

Предполагается, что вы уже создали запись для дня / имени_ озера / станции до ввода температуры в этот день. Конечно, вы можете добавить еще один триггер для этого.

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;

Вы можете объединить их в один более сложный триггер

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;

Чтобы гарантировать, что в Temperature_summary есть строка для обновления (a) сделать уникальный индекс для Temperature_summary в (day, lake_name, station) или сделать эти столбцы первичным ключом, и (b) выполнить вставку или игнорирование в триггере следующим образом:

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 голосов
/ 20 мая 2010

Триггер может быть создан для обновления счетчиков в одном триггере. Это, вероятно, повысит производительность и соберет связанные предметы в одном месте.

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;

Возможно, потребуется включить обработку триггеров для обновлений в таблицу температур, если они могут произойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...