我对 SQLite 有疑问changes()
函数,根据文档, "返回最近完成的 INSERT、DELETE 或 UPDATE 语句更改、插入或删除的数据库行数“(另请参阅底层 C/C++ 函数的文档).
我希望使用这个函数来检查是否执行了UPDATE
与单行相关的语句有really导致该行被更改或不更改。
经过changed我不仅仅意味着该行与语句匹配WHERE
条款。不,我的意思是,对于相关行,至少 1 列的值实际上是不同的执行后与执行前相比。如果你问我这是唯一正确的定义change在此背景下。
所以我希望能够检测到这样的changes通过检查是否changes()
回报1
(行已更改)或0
(行不变)执行后立即调用UPDATE
陈述。
但令我失望的是,这似乎并没有按预期工作。
请允许我举例说明:
CREATE TABLE People (Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL);
INSERT INTO People (Name) VALUES ("Astrid");
SELECT changes();
Here changes()
回报1
,正如预期的那样,因为我们只是INSERT
编辑 1 行。
UPDATE People SET Name = "Emma" WHERE Id = 1;
SELECT changes();
Here changes()
回报1
,如预期,因为 1 行是UPDATE
d(即实际上changed: the Name
of the Person
with Id = 1
was "Astrid"
但现在是"Emma"
).
UPDATE People SET Name = "John" WHERE Id = 200;
SELECT changes();
Here changes()
回报0
,正如预期的那样,因为没有行Id = 200
.
到目前为止,一切都很好。但现在看看下面的内容UPDATE
声明,其中does确实匹配现有行,但是does not实际上change它根本(Name
保持设置为"Emma"
)...
UPDATE People SET Name = "Emma" WHERE Id = 1;
SELECT changes();
Here changes()
回报1
,而我当然希望0
:-(.
如果该函数被称为类似的东西,也许这是有意义的matched_rows()
or affected_rows()
。但对于一个名为changes()
,并且按原样记录下来,这种行为让我觉得不合逻辑,或者充其量是令人困惑。
所以无论如何,有人可以解释为什么会发生这种情况,或者更好的是,建议一种替代策略以可靠(且有效)的方式实现我的目标?
我能想到的就是实际做类似的事情SELECT * FROM People WHERE Id = x
,将所有返回的列值与我要在UPDATE
语句,从而决定我是否需要执行UPDATE
根本不。但这效率不高,对吧?
当然,在这个玩具示例中,它可能并不重要,但在我的实际应用程序中,我正在处理具有更多列的表,其中一些列(可能很大)BLOB
s.