Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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
C# 更新大型SQLite数据库_C#_Sql_Sqlite - Fatal编程技术网

C# 更新大型SQLite数据库

C# 更新大型SQLite数据库,c#,sql,sqlite,C#,Sql,Sqlite,我有两个SQLite表,它们非常庞大(数百万行,其中包含几何图形)。第一个是不更改(记录不更新等)。第二个更新(可以更新/删除旧记录,也可以添加新记录) 有时我需要使用第二个表更新第一个表。由于数据量太大,我必须检测第二个表中所做的更改,并将它们应用到第一个表中。我也不能在RAM中这样做,因为表格包含几何图形,它们可能非常重 实现这一点的可能方法是什么?简单解决方案:删除第一个表,然后使用如下表达式 drop table table1; create table table1 as select

我有两个
SQLite
表,它们非常庞大(数百万行,其中包含几何图形)。第一个是不更改(记录不更新等)。第二个更新(可以更新/删除旧记录,也可以添加新记录)

有时我需要使用第二个表更新第一个表。由于数据量太大,我必须检测第二个表中所做的更改,并将它们应用到第一个表中。我也不能在RAM中这样做,因为表格包含几何图形,它们可能非常重


实现这一点的可能方法是什么?

简单解决方案:删除第一个表,然后使用如下表达式

drop table table1;
create table table1 as select * from table2;
更复杂的解决方案:使用一对移动的“游标”——不是Oracle中的数据库游标,而是一些包含表PK值的变量。 将两个游标都设置为两个表中的最低ID。然后,只需遵循简单的规则:

  • 如果表1中的记录存在于表2中,并且相同,则跳过,前进两个游标
  • 如果表1中的记录存在于表2中且不相同,则更新表1中的记录,并使两个游标前进
  • 如果表1中的记录在表2中不存在,请将其删除,然后将表1游标前进
  • 如果表2中的记录在表1中不存在,请插入它,并将其移到表2中
  • 通过这种方式,您可以得到线性O(N)算法,其中包含O(1)个内存需求(不考虑数据库操作的复杂性)