2016-05-16 31 views
1

我有一個基於user_id和event_id的複合鍵的鏈接表event_user。Sqlite複合鍵不在

我在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

@BobMalooga這不適用於像'1,20'這樣的密鑰。 –

回答

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)。