太多的SQL变量和NOT IN子句

时间:2012-09-06 08:59:30

标签: java android sql sqlite

我有一个包含id集合的表(sqlite Android),以及我想保留的一组id。

然后如果toRetain = [1,2,3,4]我创建一个执行:

DELETE FROM my_items WHERE _id NOT IN (1,2,3,4);

但是如果要保留的项目的长度非常高,则SQL引擎会抛出异常:“太多的SQL变量”。由于该条款不是IN,我不能以较小的步骤完成。

我该如何解决?

我认为一种解决方案是在时态表中插入所有ID然后执行:

DELETE FROM my_items WHERE _id NOT IN (SELECT_id FROM items_to_delete);

这个解决方案是否正确有效?

2 个答案:

答案 0 :(得分:4)

我认为创建一个临时表或表变量,然后插入要保留的所有ID。然后通过将主表与此临时变量或表变量连接从主表中删除。

这里我建议创建一个索引,如果你使用临时表也使用NOT IN的内连接

答案 1 :(得分:1)

Android在您对查询中的值进行硬编码时不喜欢它,请尝试

db.delete("my_items", "_id NOT IN (?, ?, ?, ?)", String[] {"1", "2", "3", "4"});

或者,如果您使用ContentProvider,则:

getContentResolver().delete("content://uri/to/my/items", "_id NOT IN (?, ?, ?, ?)", String[] {"1", "2", "3", "4"})