本文介绍了SQLite Changes()函数报告在某些DELETE语句中更改了0行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我最近发现CHANGES()
函数在SQLite中可用。我在我的Android代码中执行了类似以下操作:
db.execSQL(sqlStatement, argumentArray);
int result;
SQLiteStatement stmt = db.compileStatement("SELECT CHANGES()");
try {
return stmt.simpleQueryForLong();
} finally {
stmt.close();
}
我看到的是,我为以下所有语句获得了良好的数据:
UPDATE `footable` SET `stuff` = 'fepojefpjo' (returns 1 row updated)
DROP TABLE `footable` (returns 2 rows dropped)
DELETE FROM `footable` WHERE `id` IN (?,?) (returns 2 rows deleted)
但是,当我发出以下语句时,我总是得到0行的更改--即使肯定有被删除的行:
DELETE FROM `footable` (always returns 0)
因为我要从表中删除所有内容,所以我想知道SQLite是否在幕后执行某种截断操作。如果我只是在语句的末尾添加一个垃圾WHERE 1
,它将返回正确的行数。
DELETE FROM `footable` WHERE 1 (works)
问题:
- 有谁能证实这一行为?这是预期的吗?
- SQLite是否正在截断此处的表?
- 除了计算
DELETE
之前的行数外,是否有其他解决方法?
推荐答案
我认为这很可能是由于所谓的截断优化(我说最有可能是因为我不确定您使用的是哪个版本的SQLite)。当没有WHERE
子句时,SQLite使用优化来擦除整个表内容,而不必单独访问表的每一行。请参阅reference docs for DELETE。
请注意,此行为自3.6.5起已修复。
这篇关于SQLite Changes()函数报告在某些DELETE语句中更改了0行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!