2013-03-20 78 views
4

好了,我們有一個表設置一個PhoneGap的應用程式,例如插入只有當ID不存在

tblTest (actualid INTEGER PRIMARY KEY, id INTEGER, name TEXT)

的actualid針對設備和ID的唯一ID維持在服務器端數據庫。我們遇到了webservices返回重複記錄的問題,同時我們正在修復,我想添加一些東西到我們的sql,防止重複被添加(修復壞數據是一個痛苦)。

我們目前的INSERT語句設置像

INSERT INTO tblTest (id, name) VALUES (101, 'Bob')

如果運行兩次,該數據庫最終將看起來像

actualid | id| name 
     1 | 101| Bob 
     2 | 101| Bob 

而且我想什麼它看起來像是

actualid | id| name 
     1 | 101| Bob 

插入或替換會給我一個actualid 2的例子,例如任何我使用WHERE子句就像

INSERT INTO tblTest SELECT ..... WHERE.....

設置不工作,因爲沒有數據是在表中沒有找到(除非我正在做一個新手錯誤,我不是很擅長sqlite或一般的sql)。

+0

由於似乎當前的解決方案涉及創建一個ID爲UNIQUE的新表,將所有內容移動,刪除舊錶並重新命名新表,同時確保它發生一次o n在設備嘗試對數據庫執行任何操作之前,它只會發生一次...對我們來說不是一個當前有效的解決方案,我將添加代碼以在插入記錄之前手動檢查數據庫。後見之明就是它,下一次我會確保什麼時候將某些東西同步到服務器上,這樣actualid是自動增量的,而id是唯一的。 – Twomz 2013-03-21 13:40:42

回答

10

使用INSERT OR IGNORE

INSERT OR IGNORE INTO tblTest (id, name) VALUES (101, 'Bob') 

(這需要在id列的唯一索引,你已經有了。)

+0

actualid是設備的自動增量主鍵,id是從服務器獲得的非唯一鍵。後見之明是我們應該使id爲UNIQUE,但它不是......我可以在表創建後使用編譯指示使列獨一無二嗎? – Twomz 2013-03-21 13:13:07

+2

'CREATE UNIQUE INDEX indexname ON tblTest(id);'(if you have a non-index index on'id',drop it) – 2013-03-21 13:21:46

+0

甜,我不知道你可以通過索引強制唯一性。它正在處理我製作的測試數據庫,所以我將實施此修復而不是手動獲取所有ID並檢查它們(Yay!)。 – Twomz 2013-03-21 14:45:18

5

你可能想試試這個:

INSERT INTO tblTest 
     (id, name) 
     SELECT 101 as id, 'Bob' as name 
     FROM tblTest 
     WHERE NOT EXISTS(SELECT * FROM tblTest WHERE id = 101 and name = 'Bob') 
+0

正確不會重複那裏的記錄,但新記錄會導致它創建多個插入。這可能是因爲我不在乎名稱是否僅複製'id'。 – Twomz 2013-03-20 21:57:51