2012-02-01 60 views
1

我創建了一個用於更新SQLite數據庫的C++應用程序。應用程序讀取一行,用該行中的值執行一個操作,然後用當前時間更新「修改」列。我相信我只使用SELECT,INSERT,CREATE命令。SQLite,找到一個包含主鍵列的重複字段的表格

應用程序在問題開始發生前的前幾天正確運行。當我用sqlite-administrator檢查數據庫設置時,我發現有一個表有一個重複鍵值的行。

我創建的表使用此命令

CREATE TABLE 'XXXX_tasks' ('id' INTEGER PRIMARY KEY , 'data_length' INTEGER, 'data_offset' INTEGER, 'data_table' TEXT, 'device_id' INTEGER, 'modified' INTEGER, 'name' TEXT, 'object_id' INTEGER, 'object_type' TEXT, 'object_units' INTEGER, 'property' INTEGER, 'scan' INTEGER, 'type' TEXT) 

該表中的數據看起來像這樣(減少可讀性)

ID | Name | Object ID 
5 | AV_33 | 33   <=== 
2 | AV_34 | 34 
3 | AV_35 | 35 
4 | AV_36 | 36 
5 | AV_33 | 33   <=== 

看來,有一個重複鍵的兩行領域。起初我以爲這是一個損壞的數據庫文件,一個僥倖。我刪除了數據庫文件並重新啓動了應用程序。一週後發生同樣的問題。它的可重複性。

您也可以下載/查看數據庫在這裏提交自己http://www.abluestar.com/files/uploads/database_jan312012.db

我的問題是:

我不能想到的,你可以創建一個創建或更新行有任何理由重複的主鍵值。任何想法如何發生?

+0

只是想法,沒有把握:1.觸發器。 2.線程安全 - 你有嗎? 3.直接打開文件而不是使用SQLite庫。 4.問題在於'sqlite-administrator',而不是SQLite。我懷疑你已經發現SQLite本身的錯誤,它超越了堅如磐石的... – Borealid 2012-02-01 00:57:20

+0

有趣的是,第一行不能刪除的更新,它只是在那裏... – user1096188 2012-02-01 01:19:18

+0

@Borealid我已經找到了相同的表,當我用SQLite庫而不是應用程序打開SQLite數據庫。我傾向於同意SQLite超越堅如磐石,但有沒有創建類似這樣的表的「有效」方式? – 2012-02-01 17:26:50

回答

1
sqlite> select distinct id from BACnetIP_tasks order by id; 
5 
2 
3 
4 
5 

兩個5是不同的,一個5是小於2。聽起來像一個腐敗的文件。

sqlite> pragma integrity_check; 
*** in database main *** 
On tree page 4 cell 1: Rowid 2 out of order (previous was 5) 
Fragmentation of 15 bytes reported as 12 on page 4 

是的。所以,好消息是SQLite基本上看到了你所做的同樣的問題。由於上一行是5.損壞的文件,因此第2行確實是無序的。

任何想法如何發生?

不是我的頭頂,但問題出現在代碼中的可能性很大。幾乎每次發生這種事情時,都是我的問題,而不是數據庫。 (儘管我確實記得很久以前在Access 2000中發現了一些錯誤)。

SQLite3支持RENAME TABLE和ADD COLUMN,但它不支持ALTER TABLE語法的任何其他部分。所以我不認爲你所看到的可能是由ALTER TABLE語句引起的。此外,SQL語句應該會失敗,而不會導致數據庫不一致。 (這似乎也排除了觸發器,至少在正常情況下。)

+1

緩衝區溢出,損壞導致此錯誤的內存數據庫。將內存數據庫移到內存的不同部分可解決此問題。現在我只需要找到緩衝區流或內存泄漏。 – 2012-02-23 00:52:37

+0

@Stevensmethurst:邊界檢查是你的朋友。 – 2012-02-23 01:22:50

相關問題