我正在尝试为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上比我更好的灵魂?
这有效,因为该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;
你看过这个参考页面了吗?据我所知,这是"滥用汇总",可能源于该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
"使其成为一个表达式,但后来我在运算符处出现语法错误.
所以我改变了上面的解决方案.