Самый простой подход - лучший подход.
Программисты любят решать предполагаемые или предполагаемые требования, которые добавляют уровни сложности к решению.
«Я предполагаю, что этот блок кода будет узким местом в производительности, поэтому я добавлю весь этот дополнительный код для смягчения этой проблемы».
«Я предполагаю, что пользователь захочет сделать X, поэтому я добавлю эту действительно классную дополнительную функцию».
«Если я заставлю свой код решить этот ненужный сценарий, это будет Хорошая возможность использовать эту новую технологию, которую я хотел опробовать ».
На самом деле самое простое решение, которое соответствует требованиям, является лучшим. Это также дает вам максимальную гибкость при принятии решения в новом направлении, если и когда возникают новые требования или проблемы.
Это работает, потому что предложение WHEN
требует выражения :
sqlite> .schema Table1
CREATE TABLE Table1 (time int);
CREATE TRIGGER testtrigger AFTER INSERT ON Table1
WHEN 3<(SELECT Count() FROM Table1 WHERE time>(NEW.time-120))
BEGIN
INSERT INTO Table2 (time, data) VALUES (NEW.time,'data1');
END;
Have вы смотрели эту справочную страницу ? Из того, что я могу сказать, это «неправильное использование агрегата», которое, вероятно, происходит из утверждения в разделе Когда
. У вас было следующее:
sqlite> .tables
Table1 Table2
sqlite> .schema Table1
CREATE TABLE Table1 (time int);
CREATE TRIGGER testtrigger AFTER
INSERT ON Table1 WHEN
(
SELECT COUNT() AS tCount FROM
(
SELECT * FROM Table1 WHERE
time > (NEW.time - 120)
) WHERE tCount > 3
)
BEGIN
INSERT INTO Table2 (time, data) VALUES
(NEW.time, 'data1');
END;
sqlite> .schema Table2
CREATE TABLE Table2 (time int,data string);
sqlite> insert into Table1 VALUES (5);
SQL error: misuse of aggregate:
sqlite>
Я попытался удалить « WHERE tCount
», чтобы преобразовать его в выражение , но затем у меня возникла синтаксическая ошибка в операторе.
Поэтому вместо этого я переключился на решение выше.
Может быть, другой синтаксический подход?
CREATE TRIGGER testtrigger ON Table1
FOR INSERT
AS
BEGIN
DECLARE @timeNum int
SET @timeNum = SELECT count(*) FROM Table1 WHERE time > (New.time - 120)
IF @timeNum > 3
BEGIN
INSERT INTO Table2 (time, data) VALUES
(NEW.time, 'data1');
END
END
Но также попробуйте несколько отладочных операторов. Когда я отлаживал свой последний триггер для веб-сервиса, я помещал несколько операторов INSERT в настраиваемую мной таблицу отладки. Таким образом, вы можете выводить @timeNum каждый раз при вызове триггера, а затем помещать еще одну отладочную INSERT внутри цикла, чтобы проверить, действительно ли вы попали в логику Table2 INSERT.
UPDATE: Сожалею! Похоже, SqlLite отстой, я не знал, что в нем не хватает этого синтаксиса. Тем не менее, если вы не получаете никаких ответов, рассмотрите некоторые операторы отладки, чтобы убедиться, что пути вашего кода вызываются при правильных условиях.
Предложение WHEN в триггере должно быть выражением сравнения, которое возвращает истину или ложь, а не число. Попробуйте идею Дламблина.