Ms access CDATA基础::Access数据库的ExecuteSQL批量删除

Ms access CDATA基础::Access数据库的ExecuteSQL批量删除,ms-access,mfc,odbc,Ms Access,Mfc,Odbc,我有一个access数据库,有超过500000条记录,我想批量删除记录。我得到了一个ID列表,我需要根据特定的条件删除,这可能是1~5000。现在我的代码是这样的 for ( i = 0 to 5000 ) { CDatabase.ExecuteSQL( Delete from table where id = ItemToDelete(i) ) } 每次sql调用几乎需要1秒的时间 是否有进行批量删除的选项,或者是否有更好的方法 我已经好几年没做过访问了,但我也遇到了

我有一个access数据库,有超过500000条记录,我想批量删除记录。我得到了一个ID列表,我需要根据特定的条件删除,这可能是1~5000。现在我的代码是这样的

 for ( i = 0  to 5000 )
 { 
    CDatabase.ExecuteSQL( Delete from table where id = ItemToDelete(i) ) 
 }  
每次sql调用几乎需要1秒的时间


是否有进行批量删除的选项,或者是否有更好的方法

我已经好几年没做过访问了,但我也遇到了同样的挑战。我将首先尝试在“some condition”处发出DELETE命令,而不是获取满足某些条件的所有记录。它可能仍然很慢,但会将SQL调用次数从5000次减少到1次

对于如此大的#,一个更极端的解决方案可能是将整个表转储到一个文本文件中,然后编写一个小程序,只重新加载您想要的文件。可能不是一次性的好办法,但如果你每个月都这样做


但一般来说,最小化#Sql调用是提高性能的最佳方法。根据服务器的不同,如果WHERE子句只包含主键字段,则删除操作可能会快得多。

该语句应为:

Delete from table where id between 1 and 5000
如果您有条件,在大多数情况下,您应该能够构建WHERE语句。不要试图在中单独列出5000个ID。你会遇到各种各样的限制


如果无法区分删除标准,则可以在表或CSV中列出单个ID,这两种ID都可以在中使用。

我很困惑。。我想我正在这么做。。可能是我的帖子不清楚。在我的ExecuteSQL()中,我调用了一个sql语句“DELETE FROM table1 WHERE ID=I”,这是对的吗?我的想法更像是“DELETE FROM table1 WHERE ID in(4,5,76,99)”;只是发出一个电话。如果它实际上等于0到5000,它可能就是“从表1中删除,其中ID>=0,ID根据我的情况,需要删除的记录数可能为1或5000。我不确定找到记录是需要时间还是实际执行。我会尝试你的建议,但首先让我看看是否可以创建这样的字符串。@MarkStevens是的,解决方案不是很直接,因为你必须通过逻辑进行迭代,然后进行处理。Mark有正确的方法来接近您的解决方案。Access仅为单批处理过程。IE每个批只允许一条SQL语句。如果要进行大规模删除,则将ID作为字符串放入Where子句中,然后将其发送给Access to process。从id位于(…)的表中删除*。Access根本不是一个有效的DBMS。它实际上是一个人操作的。@GoldBishop 5000 IDs with in对于任何数据库来说都是一个非常糟糕的主意。Access不是DBMS,它通常使用Jet/ACE RDBMS,但并不总是这样。它不是一个人操作的,而是多用户操作的。如果使用得当,它的效率会很高。也许是个坏主意……也许这样就能解决问题。不想引起争论,但Access是一个1-5人的DBMS(包括RDBMS),从透视图的定义来看,它是一个1人系统。@bmathy…碰巧,正在对Access执行语句的应用程序,您可以执行记录集迭代吗?它将允许您执行游标样式的迭代。还有,ID为的文本文件是CSV还是CRLF分隔的?我现在正在测试CRecordSet。ID位于stl::List中如果您忽略了一个事实,即ID不在1到5000之间,那么他将有1到5000个ID要处理。而将它们放入损益表的选择权打折扣,就等于切断了一个选择权,尽管这个选择权很重,但却是一个选择权。他有一个查询执行问题,而不是查询设计问题。@GoldBishop我什么都没漏掉。代码示例表示,对于i=0到5000,删除i,即删除0到5000之间的每一行。他或她正在逐行运行,而不是设置。这是
0到5000
ID不是ID的0到5000。再读一遍,尽管他的示例代码与他的问题正文相矛盾。