我正在编写一个程序,将结构化数据恢复为(损坏的)文件中的单个记录,并将结果收集到sqlite数据库中。
使用稍微不同的恢复参数调用该程序几次。这导致经常从文件中恢复相同但有时不同的数据。
现在,每次我使用不同的参数运行我的程序时,它应该只将新的(不同的)找到的项添加到同一个数据库中。
这意味着我需要一种快速的方法来判断每个恢复的记录是否已经存在于数据库中,以便仅在数据库中尚未存在时才添加它们。
据我所知,对于我想要添加的每条记录,我可以首先对所有列执行SELECT,以查看数据库中是否已存在匹配记录,如果找不到相同记录,则只添加新记录。
但是由于我正在添加10000条记录,因此对每条记录执行SELECT操作对我来说效率都很低(慢)。
我想知道是否有更聪明的方法来处理这个问题?即,有没有办法告诉sqlite我不想要重复的条目,所以它会自动检测并拒绝它们?我知道UNIQUE修饰符,但那不是因为它只适用于单列,不是吗?我需要能够说COL1 + COL2 + COL3的组合必须是唯一的。有没有办法做到这一点?
注意:我从不想更新任何现有记录。我只想收集一组不同的记录。
奖金部分 - 效果
在经典编程语言中,我使用键值字典,其中键是所有记录值的总和。类似地,我可以为每个添加的记录计算哈希代码,并首先查看哈希代码。如果没有匹配,那么记录肯定不在数据库中;如果有匹配,我仍然需要在数据库中搜索任何重复项。那肯定会更快,但我仍然想知道sqlite是否可以提高效率。
答案 0 :(得分: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>
答案 1 :(得分:1)
您可以使用UNIQUE列约束或声明可以使用UNIQUE () ON CONFLICT的多列唯一约束:
CREATE TABLE name ( id int , UNIQUE (col_name1 type , col_name2 type) ON CONFLICT IGNORE )
SQLite有两种表达唯一性约束的方法:PRIMARY KEY和UNIQUE。它们都创建了一个索引,因此通过创建的索引进行查找。
答案 2 :(得分:1)
如果您不想使用SQL方法(如其他答案中所述),您可以在程序启动时对所有数据进行选择,将数据存储在字典中并使用字典确定哪些记录为插入您的数据库。
这种方法的好处是单选择比许多小选择快得多。 缺点是如果没有足够的内存来存储数据,它将无法正常工作。