SQLite,找到了一个表,该表中的行的主键列具有重复字段 < >我创建了一个C++应用程序,它更新SQLite数据库。应用程序读取一行,使用该行中的值执行操作,然后使用当前时间更新“modified”列。我相信我只是在使用SELECT、INSERT和CREATE命令

SQLite,找到了一个表,该表中的行的主键列具有重复字段 < >我创建了一个C++应用程序,它更新SQLite数据库。应用程序读取一行,使用该行中的值执行操作,然后使用当前时间更新“modified”列。我相信我只是在使用SELECT、INSERT和CREATE命令,sql,database,sqlite,Sql,Database,Sqlite,在问题开始出现之前的前几天,应用程序运行正常。当我用检查数据库设置时,我发现有一个表的一行具有重复的键值 我用这个命令创建了表 CREATE TABLE 'XXXX_tasks' ( 'id' INTEGER PRIMARY KEY , 'data_length' INTEGER, 'data_offset' INTEGER, 'data_table' TEXT, 'device_id' INTEGER, 'modified' INTEGER, 'name' TEXT, 'obje

在问题开始出现之前的前几天,应用程序运行正常。当我用检查数据库设置时,我发现有一个表的一行具有重复的键值

我用这个命令创建了表

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 |对象ID
5 | AV|u 33 | 33
两个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行。损坏的文件

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
你知道这是怎么发生的吗

这不是我想的,但问题很可能出在你的代码中。几乎每次这样的事情发生在我身上,都是我的问题,而不是数据库的问题。(尽管我记得很久以前在Access 2000中发现了几个bug。)

SQLite3支持重命名表和添加列,但不支持ALTERTABLE语法的任何其他部分。所以我不认为你看到的是ALTERTABLE语句引起的。此外,SQL语句应该失败,而不是导致数据库不一致。(至少在正常情况下,这似乎也排除了触发因素。)

两个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行。损坏的文件

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
你知道这是怎么发生的吗

这不是我想的,但问题很可能出在你的代码中。几乎每次这样的事情发生在我身上,都是我的问题,而不是数据库的问题。(尽管我记得很久以前在Access 2000中发现了几个bug。)


SQLite3支持重命名表和添加列,但不支持ALTERTABLE语法的任何其他部分。所以我不认为你看到的是ALTERTABLE语句引起的。此外,SQL语句应该失败,而不是导致数据库不一致。(至少在正常情况下,这似乎也排除了触发因素。)

只是想法,没有确定性:1。触发器。2.线程安全-你有它吗?3.直接打开文件,而不是使用SQLite库。4.问题在于sqlite管理员,而不是sqlite。我怀疑你是否在SQLite本身中发现了一个bug,它已经超出了岩石般坚固的范围……有趣的是,第一行无法删除或更新,它只是停留在那里…@Borealid当我用SQLite库而不是应用程序打开SQLite数据库时,我发现了相同的表。我倾向于同意SQLite是坚如磐石的,但有没有“有效”的方法来创建这样一个表?@Stevensmethurst只在某个地方有一个
ALTER table
。只有想法,没有确定性:1。触发器。2.线程安全-你有它吗?3.直接打开文件,而不是使用SQLite库。4.问题在于sqlite管理员,而不是sqlite。我怀疑你是否在SQLite本身中发现了一个bug,它已经超出了岩石般坚固的范围……有趣的是,第一行无法删除或更新,它只是停留在那里…@Borealid当我用SQLite库而不是应用程序打开SQLite数据库时,我发现了相同的表。我倾向于同意SQLite是坚不可摧的,但有没有“有效”的方法来创建这样的表?@Stevensmethurst只在其中某个地方有一个
ALTER table
。缓冲区溢出,破坏了导致此错误的内存中数据库。将内存中的数据库移动到内存的不同部分解决了此问题。现在我只需要找到缓冲区流或内存泄漏。@Stevensmethurst:Bounds checking是您的朋友。缓冲区溢出,损坏了导致此错误的内存中数据库。将内存中的数据库移动到内存的不同部分解决了此问题。现在我只需要找到缓冲区流或内存泄漏。@Stevensmethurst:边界检查是你的朋友。