SQLite Changes()函数报告在某些DELETE语句中更改了0行 [英] SQLite changes() function reports 0 rows changed in certain delete statements

查看:281
本文介绍了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)

问题:

  1. 有谁能证实这一行为?这是预期的吗?
  2. SQLite是否正在截断此处的表?
  3. 除了计算DELETE之前的行数外,是否有其他解决方法?

推荐答案

我认为这很可能是由于所谓的截断优化(我说最有可能是因为我不确定您使用的是哪个版本的SQLite)。当没有WHERE子句时,SQLite使用优化来擦除整个表内容,而不必单独访问表的每一行。请参阅reference docs for DELETE

请注意,此行为自3.6.5起已修复。

这篇关于SQLite Changes()函数报告在某些DELETE语句中更改了0行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆