在 SQLite3 中有一个非常简单的数据集。我希望
INSERT
被执行 only-if 最后一行的数据不同。
我想避免
TRIGGER
:我需要让我的应用程序决定是否需要上述过滤(如果不需要,则有一个简单的插入)。
这是 SQLFiddle 演示。
表定义:
CREATE TABLE Test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date datetime,
text TEXT,
text2 TEXT
);
有时我需要插入数据仅当最后插入不同(文本字段与我们的待插入文本不同)。
所以我需要使用一些基本的子查询,以便在最后一行不相同的情况下获得许可。
我可以在一步内完成这个子查询吗(即不再有更多子查询):
类似这样的东西,但这有语法错误。
SELECT 1 FROM Test ORDER BY id DESC LIMIT 1 HAVING text="mynewtext"
也许有WINDOW功能?或者简单的单个子查询:
INSERT INTO Test
SELECT null, '2025-01-22 10:10:03', 'Data5', 'DATA2'
WHERE (
SELECT (text!="Data5")+(text2!="DATA2") from Test ORDER BY id DESC LIMIT 1);
上述解决方案有效。但我把它留在这里作为参考,有些人可能有改进的想法。
也许考虑以下利用 CTE 的方法:-
WITH
cte_values(vdate,vtext,vtext2,vconditional) AS (SELECT '2025-01-22 10:10:00','Data5','DATA',1),
cte_lastbyid(ldate,ltext,ltext2) AS (SELECT date,text,text2 FROM test ORDER BY id DESC LIMIT 1)
INSERT INTO test(date,text,text2)
SELECT vdate,vtext,vtext2 FROM cte_values
WHERE (NOT (SELECT vconditional FROM cte_values))
OR (
(SELECT ltext FROM cte_lastbyid) != (SELECT vtext FROM cte_values)
OR
(SELECT ltext2 FROM cte_lastbyid) != (SELECT vtext2 FROM cte_values)
)
;
/* IDENTICAL OTHER THAN the conditional flag has been changed to insert irrespective*/
WITH
cte_values(vdate,vtext,vtext2,vconditional) AS (SELECT '2025-01-22 10:10:00','Data5','DATA',0 /*<<<<<< NOW UNCONDITIONAL*/),
cte_lastbyid(ldate,ltext,ltext2) AS (SELECT date,text,text2 FROM test ORDER BY id DESC LIMIT 1)
INSERT INTO test(date,text,text2)
SELECT vdate,vtext,vtext2 FROM cte_values
WHERE (NOT (SELECT vconditional FROM cte_values))
OR (
(SELECT ltext FROM cte_lastbyid) != (SELECT vtext FROM cte_values)
OR
(SELECT ltext2 FROM cte_lastbyid) != (SELECT vtext2 FROM cte_values)
)
;
SELECT * FROM test
运行会导致:-