0

我正在编写一个程序,该程序将结构化数据作为单个记录从(损坏的)文件中恢复,并将结果收集到 sqlite 数据库中。

该程序被多次调用,恢复参数略有不同。这导致通常从文件中恢复相同但有时不同的数据。

现在,每次我使用不同的参数运行我的程序时,它应该只将新(不同)找到的项目添加到同一个数据库中。

这意味着我需要一种快速的方法来判断每个恢复的记录是否已经存在于数据库中,以便仅当它们在数据库中不存在时才添加它们。

我知道对于我要添加的每条记录,我可以首先对所有列执行 SELECT 以查看数据库中是否已经存在匹配的记录,如果没有找到相同的记录,则仅添加新记录。

但是由于我要添加 10000 条记录,因此对每条记录执行 SELECT 对我来说效率非常低(慢)。

我想知道是否有更聪明的方法来处理这个问题?即,有没有办法告诉 sqlite 我不想要重复的条目,所以它会自动检测并拒绝它们?我知道 UNIQUE 修饰符,但不是因为它仅适用于单列,不是吗?我需要能够说 COL1+COL2+COL3 的组合必须是唯一的。有没有办法做到这一点?

注意:我从不想更新任何现有记录。我只想收集一组不同的记录。

奖金部分 - 性能

在经典的编程语言中,我会使用键值字典,其中键是所有记录值的总和。同样,我可以为每条添加的记录计算一个哈希码,然后首先查看该哈希码。如果没有匹配,那么该记录肯定不在数据库中;如果有匹配项,我仍然需要在数据库中搜索任何重复项。那肯定已经更快了,但我仍然想知道 sqlite 是否可以提高效率。

4

3 回答 3

2

尝试:

sqlite> create table foo (
   ...>         a int,
   ...>         b int,
   ...>         unique(a, b)
   ...> );
sqlite>
sqlite> insert into foo values(1, 2);
sqlite> insert into foo values(2, 1);
sqlite> insert into foo values(1, 2);
Error: columns a, b are not unique
sqlite>
于 2013-08-25T15:11:34.833 回答
1

您可以使用 UNIQUE 列约束或声明一个多列唯一约束,您可以使用UNIQUE () ON CONFLICT

CREATE TABLE name ( id int , UNIQUE (col_name1 type , col_name2 type) ON CONFLICT IGNORE )

SQLite 有两种表达唯一性约束的方式:PRIMARY KEY 和 UNIQUE。他们都创建了一个索引,因此查找是通过创建的索引进行的。

于 2013-08-25T15:09:53.153 回答
1

如果您不想使用 SQL 方法(如其他答案中所述),您可以在程序启动时对所有数据进行选择,将数据存储在字典中并使用字典决定将哪些记录插入到您的D B。

这种方法的好处是单个选择比许多小选择要快得多。缺点是如果您没有足够的内存来存储数据,它将无法正常工作。

于 2013-08-25T15:15:41.133 回答