检查 SQLite3中是否存在行的有效查询

这是检查表中是否存在行的最有效方法吗?

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");

桌子是..。

CREATE TABLE myTbl(id INT PRIMARY KEY, u_tag TEXT);

如果该行不存在,那么它的返回值是什么?它是 false (bool)还是0(int)或 NULL?

115450 次浏览

再次引用 文件的话:

EXISTS 运算符始终计算为整数值0和1之一。如果执行指定为 EXISTS 操作符右侧操作数的 SELECT 语句将返回一行或多行,则 EXISTS 操作符的计算结果为1。如果执行 SELECT 将根本不返回任何行,那么 EXISTS 运算符的计算结果为0。

至于使用 EXISTS是否比使用 count(*)更有效,这可能取决于表的大小以及表是否有索引。在这两个查询上尝试 EXPLAIN进行基准测试(或者只测试每个查询的时间)。

虽然文档并没有暗示它,但是显然主 sqlite dev (Richard Hipp)有 在邮件列表中确认EXISTS为您短路。

SQLite 中的查询规划程序虽然不够聪明,但足以 know that it can stop and return true as soon as it sees the first row 从 EXISTS ()中的查询。

因此,您提出的查询将是最有效的:

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");

如果对可移植性感到不安,可以添加一个限制。不过我怀疑大多数 DBs 都会给你提供同样的短路。

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag" LIMIT 1);

如果您不需要记录中的某些内容,那么选择1是公认的做法,尽管您所选择的内容无论如何都不应该真正重要。

Put an index on your tag field. If you do not, a query for a non-existent tag will do a full table scan.

EXISTS states that it will return 1 or 0, not null.