我正在尝试为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
Run Code Online (Sandbox Code Playgroud)
那些在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;
Run Code Online (Sandbox Code Playgroud)
你看过这个参考页面了吗?据我所知,这是"滥用汇总",可能源于该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>
Run Code Online (Sandbox Code Playgroud)
我尝试删除" WHERE tCount
"使其成为一个表达式,但后来我在运算符处出现语法错误.
所以我改变了上面的解决方案.
归档时间: |
|
查看次数: |
22375 次 |
最近记录: |