Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止向SQL数据库中添加相同的记录_Sql_Sqlite - Fatal编程技术网

如何防止向SQL数据库中添加相同的记录

如何防止向SQL数据库中添加相同的记录,sql,sqlite,Sql,Sqlite,我正在编写一个程序,将结构化数据作为单个记录从(损坏的)文件中恢复,并将结果收集到sqlite数据库中 程序被调用数次,恢复参数略有不同。这通常会导致从文件中恢复相同但有时不同的数据 现在,每次我用不同的参数运行我的程序时,它应该只向同一个数据库添加新发现的(不同的)项 这意味着我需要一种快速的方法来判断每个恢复的记录是否已经存在于数据库中,以便仅当它们还不存在于数据库中时才添加它们 我知道,对于我要添加的每个记录,我可以首先对所有列进行选择,以查看数据库中是否已经存在匹配的记录,并且只有在没有

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

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

现在,每次我用不同的参数运行我的程序时,它应该只向同一个数据库添加新发现的(不同的)项

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

我知道,对于我要添加的每个记录,我可以首先对所有列进行选择,以查看数据库中是否已经存在匹配的记录,并且只有在没有找到匹配的记录时才添加新记录

但是,由于我要添加10000条记录,对每一条记录进行选择对我来说效率很低(很慢)

我想知道是否有更聪明的方法来处理这件事?也就是说,有没有一种方法可以告诉sqlite我不想要重复的条目,因此它会自动检测并拒绝它们?我知道UNIQUE修饰符,但那不是它,因为它只适用于单列,不是吗?我需要能够说COL1+COL2+COL3的组合必须是唯一的。有办法吗

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

奖金部分-绩效


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

您可以使用UNIQUE column约束,或者声明可以使用的多列UNIQUE约束:


SQLite有两种表达唯一性约束的方式:主键和唯一性。它们都创建一个索引,因此通过创建的索引进行查找。

您可以使用唯一列约束或声明多列唯一约束,您可以使用:

SQLite有两种表达唯一性约束的方式:主键和唯一性。它们都创建了索引,因此通过创建的索引进行查找。

尝试:

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>
尝试:


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

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

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

这种方法的好处是单一选择比许多小选择快得多。

缺点是,如果没有足够的内存来存储数据,它将无法正常工作

演出怎么样?它只是单独搜索所有项目,还是使用一些更智能(更快)的算法,例如使用哈希来加速搜索?多列也是唯一的:@ThomasTempelmann用于查找如果你在该列上有一个索引,那么你肯定可以加快查找速度……是的,我理解索引。但问题是:唯一的测试过程是否只是通过索引查找每一列,直到发现不匹配?或者它能做得更多?我想知道我是否还应该另外使用散列码。或者这可能太过分了。我可以对此进行测试,但我想知道是否有人可以事先告诉我详细信息。是的,索引是由SQLITE自动创建并用于查找的。性能如何?它只是单独搜索所有项目,还是使用一些更智能(更快)的算法,例如使用哈希来加速搜索?多列也是唯一的:@ThomasTempelmann用于查找如果你在该列上有一个索引,那么你肯定可以加快查找速度……是的,我理解索引。但问题是:唯一的测试过程是否只是通过索引查找每一列,直到发现不匹配?或者它能做得更多?我想知道我是否还应该另外使用散列码。或者这可能太过分了。我可以对此进行测试,但我想知道是否有人可以事先告诉我详细信息。是的,索引是由SQLITEOOK自动创建并用于查找的,这就解释了语法。演出怎么样?请参阅我对的评论@aleroot@ThomasTempelmann,在性能方面我帮不上忙,我从未在大量使用的应用程序中使用过sqlite。好的,这就解释了语法。演出怎么样?请参阅我对的评论@aleroot@ThomasTempelmann,在性能方面我无能为力,我从未在大量使用的应用程序中使用过sqlite。虽然这不是一个坏主意,但我担心我可能确实会耗尽内存。因此,首先将记录一个接一个地存储在数据库中。但是,如果我使用散列方法,我可以根据您的建议在应用程序启动时将这些散列存储在本地内存中。除非这太过分了,因为在数据库中查找哈希值的速度一样快。@ThomasTempelmann-从我的无关测试来看,访问内存要比访问数据库快得多(只要内存没有缓存到磁盘上)。嗯。。。不过,sqlite数据库也是如此。如果引擎写得很好(我想是的),它将使用内存-
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>