在SQLite中创建条件SQL触发器

时间:2009-06-29 20:01:58

标签: sql sqlite triggers

我正在尝试为sqlite编写一个触发器,并且遇到各种各样的问题。事实上,我认为我的真正问题在于我在sql语言中的糟糕背景。无论如何这里... ...

我有两个表Table1和Table2。 Table1有一个名为time的列(64位整数时间)。我需要一个触发器来监视Table1中插入的​​新行。如果Table1中有3行或更多行的时间大于X(以下示例中的硬编码值为120秒),我需要在Table2中插入一个新行。

这是我到目前为止(注意这不起作用)

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

那些在SQL方面比我更好的灵魂?

3 个答案:

答案 0 :(得分:9)

这是有效的,因为WHEN子句需要expression

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;

你看过这个reference page了吗?据我所知,这是“滥用汇总”,可能源于When部分的陈述。你有这个:

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”以使其成为expression,但后来我在操作员处遇到语法错误。

所以我改变了上面的解决方案。

答案 1 :(得分:1)

触发器中的WHEN子句应该是一个返回true或false的比较表达式,而不是返回一个数字。尝试dlamblin的想法。

答案 2 :(得分:-5)

也许是一种不同的语法方法?

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

但是,也可以尝试一些调试语句。当我调试我的最后一个web服务触发器时,我将一些INSERT语句放入我设置的调试表中。那么你可以在每次调用触发器时输出@timeNum,然后在循环中放入另一个调试INSERT,看看你是否真的进入了你的Table2 INSERT逻辑。

更新: 抱歉!看起来SqlLite有点糟糕,我不知道它缺少一些这种语法。尽管如此,如果您没有得到任何答案,请考虑一些调试语句,以确保在适当的条件下调用您的代码路径。