Sqlite复合键不在

时间:2016-05-16 21:53:59

标签: android sqlite

我有一个链接表event_user,其中包含一个基于user_id和event_id的复合键。

我在Java中有一个(user_id,event_id)对的数组,我想确保在表中不存在任何其他(user_id,event_id)对并不存在于数组中

在其他表中,我刚创建了一串id,然后我创建了以下查询

DELETE FROM tablename WHERE column NOT IN ( 1 , 2 , ... n)

但是,使用NOT IN无法实现此行为。 如何有效地使用Java和sqlite实现呢?

提前致谢。

1 个答案:

答案 0 :(得分:1)

在SQLite中,IN仅适用于单个列。 所以你必须明确地写出所有的比较:

DELETE FROM TableName
WHERE (Col1 != 1 OR Col2 != 10)
  AND (Col1 != 2 OR Col2 != 20)
  AND ...;

SQLite可以为大型IN列表构建索引,但是对于像这样的大型表达式却没有这样做。 因此,如果查询变得太大,您可以将ID放入临时表中,并使用子查询来检查匹配的行:

DELETE FROM TableName
WHERE NOT EXISTS (SELECT 1
                  FROM IDsToKeep
                  WHERE IDsToKeep.Col1 = TableName.Col1
                    AND IDsToKeep.Col2 = TableName.Col2);

为了提高效率,临时表应该被编入索引(或者只是WITHOUT ROWID table,两列都有PK)。