仅在最后一行不同时插入 - 性能考虑因素

问题描述 投票:0回答:1

在 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);
上述解决方案有效。但我把它留在这里作为参考,有些人可能有改进的想法。

sqlite
1个回答
0
投票
您可以传递一个 true 或 false 的附加值(任何非零值或零),然后测试该值作为 WHERE 子句的一部分。

也许考虑以下利用 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) ) ;

    请注意,在这种情况下,由于 TRUE 已为 vconditional 值进行编码,因此 INSERT 的条件是现有数据和新数据之间的 text 或 text2 值不匹配。
  • CTE(通用表表达式)不是必需的,但它们可以使 SQL 更易于阅读。因此,您可以将条件应用于原始 SQL 的 WHERE 子句。
虽然:-

/* 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) ) ;

    唯一的区别是条件标志为 FALSE
在之前、之间和之后都使用

SELECT * FROM test

 运行会导致:-

Before

    表格已加载

Between

    条件标志为 true 后的表格

After

    条件标志为 false 后的表(因此值比较无关)
© www.soinside.com 2019 - 2024. All rights reserved.