我正在尝试为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方面比我更好的灵魂?
答案 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有点糟糕,我不知道它缺少一些这种语法。尽管如此,如果您没有得到任何答案,请考虑一些调试语句,以确保在适当的条件下调用您的代码路径。