2012-06-15 293 views
0

我有一列一個數據庫,並創建它像這樣避免重複行

function populateDB(tx){ 
    tx.executeSql('CREATE TABLE IF NOT EXISTS RESULT(result, UNIQUE(result))'); 
} 
然而

,當我想寫對象到表中,我得到的錯誤:

could not execute statement (19 constraint failed)

只有當我將NOT NULL和PRIMARY KEY添加到設置時纔會出現此錯誤。如果沒有它,它會一直在我的數據庫中寫入重複數據(我在啓動phonegap iOS應用程序時使用webservice的數據填充數據庫,所以我想在數據庫級別捕獲重複行)

起初我只有「PRIMARY KEY「,並且由於錯誤提到了約束條件,所以我假定主鍵必須是」NOT NULL「,並將其添加到代碼中,但我仍然遇到同樣的錯誤。

我該如何解決這個問題。在此先感謝

編輯:也許知道我寫入字符串的JSON對象到結果列是很重要的。

編輯:我在這個函數中插入對象。基本上我做一個接一個:

this.save = function(){ 
    db.transaction (function(transaction){ 
     object = $.toJSON(self); 
     object = encodeURI(object); 
     transaction.executeSql('INSERT INTO RESULT (result) VALUES ("'+object+'")'); 
     }, 
     errorCB, 
     successCB 
    ); 
} 

編輯:我更新了我的設置表的代碼。錯誤不會發生在每一行上,但對象實際上是唯一的。

+0

一個'PRIMARY KEY'強制執行'UNIQUE CONSTRAINT'。所以這就是你的重複失敗的限制。但是,爲了解決您的問題,我們需要知道您如何插入數據。一次一行,一個批量插入,從另一個表等,等? – MatBailie

+0

19,這是某種記錄? :P –

+0

是否在定義更改後刪除並重新創建了表?通過爲表中已經存在的數據生成錯誤,「19」約束違規錯誤基本上爲您的目的服務。 – dhaval

回答

0

「如果不存在」就在這裏。當您在SQLite查詢中使用諸如「IF NOT EXISTS」或「REPLACE」,「IGNORE」等條件時,您會遇到約束失敗。

假設你試圖創建一個已經存在的表,那麼約束(如果它已經存在,不會再創建表)會失敗,因此查詢失敗(你真的想要 - 你不想重複表格是否正確?),並給出錯誤約束失敗。

您可能會收到類似的錯誤在INSERT或替換,插入或疏忽等...