我有一个链接表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实现呢?
提前致谢。
答案 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)。