Создание условного SQL инициировало в SQLite

Самый простой подход - лучший подход.

Программисты любят решать предполагаемые или предполагаемые требования, которые добавляют уровни сложности к решению.

«Я предполагаю, что этот блок кода будет узким местом в производительности, поэтому я добавлю весь этот дополнительный код для смягчения этой проблемы».

«Я предполагаю, что пользователь захочет сделать X, поэтому я добавлю эту действительно классную дополнительную функцию».

«Если я заставлю свой код решить этот ненужный сценарий, это будет Хорошая возможность использовать эту новую технологию, которую я хотел опробовать ».

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

10
задан Jan Wikholm 24 February 2012 в 11:12
поделиться

3 ответа

Это работает, потому что предложение 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 », чтобы преобразовать его в выражение , но затем у меня возникла синтаксическая ошибка в операторе.

Поэтому вместо этого я переключился на решение выше.

9
ответ дан 4 December 2019 в 03:39
поделиться

Может быть, другой синтаксический подход?

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 отстой, я не знал, что в нем не хватает этого синтаксиса. Тем не менее, если вы не получаете никаких ответов, рассмотрите некоторые операторы отладки, чтобы убедиться, что пути вашего кода вызываются при правильных условиях.

-5
ответ дан 4 December 2019 в 03:39
поделиться

Предложение WHEN в триггере должно быть выражением сравнения, которое возвращает истину или ложь, а не число. Попробуйте идею Дламблина.

1
ответ дан 4 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: