2011-07-07 69 views

回答

30

您可以指定在表定義,這將使行是REPLACE d一個UNIQUE指數:

CREATE TABLE mytable (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT NOT NULL, 
    UNIQUE (id) ON CONFLICT REPLACE 
) 

如果行INSERT或UPDATE語句試圖添加一行已經存在一個id,現有的行被替換爲新的。

+1

+1潛在的危險,但也是有用的功能我還沒有聽說過befor。 – piotrpo

+3

確實,您必須小心並確保它在所有情況下都是理想的結果。它適用於將本地數據庫與遠程數據同步等功能。 –

+0

謝謝。這將現在工作。但是,據我瞭解,如果我用這個聲明創建一個表格,它會在每次出現衝突時進行替換。但是如果我不想在每次插入時使用這種衝突解決方案呢? – kibibyte

0

默認情況下,我有唯一的索引異常將被引發重複索引插入。常見的解決方案是之前檢查記錄是否存在執行插入 - 僞代碼:

select * from people where name = 'Smith'; 
//if resultset is empty then perform insert 
insert into people values 'Smith' 
6

有一個ON CONFLICT子句中的SQLite,你可以說INSERT INTO ... ON CONFLICT...

請閱讀文檔。 http://www.sqlite.org/lang_conflict.html

+0

事實上,如果你不總是想要取代衝突。 –

+0

這是否適用於多個插入語句? – kaz