我创建了一个更新SQLite数据库的C ++应用程序。应用程序读取一行,使用行中的值执行操作,然后使用当前时间更新“已修改”列。我相信我只使用SELECT,INSERT,CREATE命令。
应用程序在问题开始之前的前几天正确运行。当我使用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 <===
看来有两行有一个重复的KEY字段。起初我以为它是一个损坏的数据库文件,一个侥幸。我删除了数据库文件并重新启动了应用程序。一周后出现同样的问题。它可重复。
您可以在http://www.abluestar.com/files/uploads/database_jan312012.db
自行下载/查看数据库文件我的问题是:
我无法想到您可以创建创建或更新行以获得重复的主键值的任何原因。任何想法如何发生这种情况?
答案 0 :(得分: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看到的问题基本上与你一样。第2行确实是乱序的,因为上一行是5. Corrupt file。
任何想法如何发生这种情况?
不是我的头脑,但问题出在您的代码中的可能性很大。几乎每次这样的事情都发生在我身上,这是我的问题,而不是数据库的问题。 (虽然我记得很久以前在Access 2000中发现了一些错误。)
SQLite3支持RENAME TABLE和ADD COLUMN,但它不支持ALTER TABLE语法的任何其他部分。因此,我不认为您看到的内容可能是由ALTER TABLE语句引起的。此外,SQL语句应该失败而不是导致数据库不一致。 (这似乎也排除了触发器,至少在正常情况下。)