2011-10-16 25 views
1

我有一個帶有行(行)的文本文件。每行都是數據庫表中的記錄。我讀這個文件並填充數據庫。SQLite INSERT命令返回錯誤「列號不唯一」

創建表的命令:

CREATE TABLE gosts(number TEXT PRIMARY KEY, userNumber TEXT, status TEXT, date TEXT, title TEXT, engTitle TEXT, description TEXT, mainCategory INTEGER, category INTEGER, subCategory INTEGER); 

插入查詢:

INSERT INTO gosts VALUES ("30331.8-95", "ÃÎÑÒ 30331.8-95", "Äåéñòâóþùèé", "01.07.1996", "Ýëåêòðîóñòàíîâêè çäàíèé. ×àñòü 4. Òðåáîâàíèÿ ïî îáåñïå÷åíèþ áåçîïàñíîñòè. Îáùèå òðåáîâàíèÿ ïî ïðèìåíåíèþ ìåð çàùèòû äëÿ îáåñïå÷åíèÿ áåçîïàñíîñòè. Òðåáîâàíèÿ ïî ïðèìåíåíèþ ìåð çàùèòû îò ïîðàæåíèÿ ýëåêòðè÷åñêèì òîêîì", "Electrical installations of buildings. Part 4. Protection for safety. Applisation of protective measues for safety. Measures of protection against electric shock", "Íàñòîÿùèé ñòàíäàðò óñòàíàâëèâàåò îáùèå òðåáîâàíèÿ ïî ïðèìåíåíèþ ìåð çàùèòû äëÿ îáåñïå÷åíèÿ áåçîïàñíîñòè è òðåáîâàíèÿ ïî ïðèìåíåíèþ ìåð çàùèòû îò ïîðàæåíèÿ ýëåêòðè÷åñêèì òîêîì ïðè ýêñïëóàòàöèè ýëåêòðîóñòàíîâîê çäàíèé", 37, 333, 628); 

請忽略編碼問題。源文件具有cp1251編碼,但插入示例取自控制檯。我試圖使用utf-8,但有同樣的問題。

使用的SQLite以上代碼:

if(sqlite3_prepare_v2(database, query, -1, &statement, 0) == SQLITE_OK) { 
... 
} 

函數調用不返回SQLITE_OK。我gea錯誤消息:

string error = sqlite3_errmsg(database); 
if(error != "not an error") cout << query << " " << error << endl; 

奇怪的是,一些記錄插入沒有錯誤,我無法找到好記錄和壞記錄之間的差異。

如果需要,我可以提供更多信息。

+2

錯誤「列號不唯一」表示數值存在於數據庫中(是主鍵),所以您不能插入具有此數字的另一行 –

+0

但在我的情況下,主鍵是文本(不是一個號碼)。爲什麼我們討論一個數字? –

+1

@MiguelPrz提到'數字',因爲那是具有非唯一值的列。混淆來自實際上是TEXT類型的名爲'number'的表列。 – Gibron

回答

2

我敢打賭,好的和壞的行之間的差異是否與'數字'列相關的值已經在表中。

這是表設計通常不使用TEXT價值列PRIMARY KEY s的原因之一。

如果可以重新創建表格,我會創建一個ID字段,負責表格的PRIMARY KEY。進一步啓用IDENTITY屬性來自動增加主鍵值。

這應該可以防止插入失敗,因爲在「數字」列中有重複的值。

現在如果'數字'列中的值必須是是唯一的,那麼您應該在該列上添加UNIQUE約束。
注:因爲它似乎您試圖與column'number相同的值」

審查SQLite CREATE TABLE documentation更多細節添加多行的UNIQUE將產生目前您收到同樣的錯誤。

+0

感謝您的快速回復。字段「數字」可能是唯一的,是的。在我的情況下,數據庫很簡單,我不會引用其他表中的「gosts」實體。但是我稍後會考慮「id」字段。 –