一次多次插入

时间:2015-02-13 14:11:52

标签: mysql sql-server coldfusion coldfusion-10

我要求一次在表格中插入大约2500-3000行数据。我需要为MySQL和SQL Server执行此操作。所以我找到的可能的解决方案是

  1. cfquery内写cfloop
  2. cfloop内使用cfquery生成类似INSERT INTO tbl VALUES((),(),())的sql语句。但问题是这个 语法是它一次只能插入1000条记录。我需要更多。
  3. 有人能告诉我什么是处理这种情况的最佳方式?

5 个答案:

答案 0 :(得分:5)

当您处理数千条记录时,小的增量延迟会立即开始加起来。逐个插入此行数将比发出BULK INSERT语句花费更多时间,原因有多种,例如网络流量增加,内部数据库操作等等。

我将假设您正在接收文件中的数据。在这种情况下,这些是您需要采取的一般步骤:

  1. 验证数据。很重要。即使您从受信任环境中的受信任来源接收数据,文件也很容易在很多方面被破坏,截断或损坏。它们还可能包含差异,因为服务器版本(SQL Server 2000与2008)或供应商(您的源可能是Oracle数据库)之间的差异很小但有时很大。
  2. 发布BULK INSERT语句,假设您使用的是SQL Server 2005或更高版本。我认为命令在2005和更新版本之间的工作方式有所不同,所以在尝试之前请检查语法。
  3. 根据您的配置和您可能需要的任何其他内容,您可能希望更新表上的索引,甚至重新创建它们。同样,这取决于桌子的大小和您的需求。这部分过程可能需要花费最长的时间,甚至可能使表离线,但您的用户将非常感谢您这样做。
  4. 仔细规划整个插入过程是值得的,这样您就不会破坏正常的业务活动,并继续提供最好的服务和可用性。

    作为结束思想,您应该使用不同的方法运行测试。逐个与批量一致,以确保您获得最佳性能。但是,我相信您总会发现批次或批量插入是可行的方法。他们将该功能添加到Transact-SQL语言中的原因是性能。这将节省网络带宽,资源和时间。

答案 1 :(得分:3)

你用MySQL标记了这个,所以我假设你正在使用MySQL。我也遇到过这类问题,我们从外部数据库导入人力资源信息。我发现验证数据,将其存储在CSV文件中并使用LOAD DATA INFILE syntax导入数据要快得多。

答案 2 :(得分:2)

在SQL Server(至少2008及以上版本)中,您可以通过单个INSERT语句一次插入多行:

INSERT INTO mytable (column1, column2) VALUES (value1, value2), (value3, value4);

我不知道一次可插入的行数是否存在限制(例如1000),但我同意@RhysJones您可能希望限制为100行遇到错误的时间 - 这样可以更容易地发现错误并更正错误。

由于你正在使用ColdFusion,我的建议是一次循环外部文件100的行:

 <cfquery name="q_insert_rows">
    INSERT INTO mytable ( column1, column2, column3 )
    VALUES
    <cfloop query="external_data" startrow="#startrow#" endrow="#endrow#">
        ( <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#value1#" />
        , <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#value2#" />
        , <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#value3#" /> )
        <cfif currentRow NEQ endrow> , </cfif>
    </cfloop>
 </cfquery>

上面的<cfquery>块应放在循环中:

<cfloop from="1" to="#external_data.recordCount#" step="100" index="startrow">
    <cfset endrow = min(startrow + 99, external_data.recordCount) />
    ...
</cfloop>

如果您希望在一次插入失败时整个操作失败,请将上述循环包装在<cftransaction>中。

答案 3 :(得分:1)

如果可能的话,使用更合适的工具来解决这个问题,而不是使用ColdFusion来解决它。

SQL Server可以directly import the contents of a spreadsheet

  

连接到Sql Server 2005数据库后,在“对象资源管理器”窗口中,右键单击要导入表的数据库。选择任务 - &gt;导入数据。这是一个简单的工具,允许您将传入的数据“映射”到适当的表中。您可以保存脚本以在需要时再次运行。

您应该能够在SQL Server中创建一个可以从ColdFusion调用的函数,传递服务器上电子表格的位置(当然,在非Web可访问的文件夹中)。

对于MySQL,正如Paul Rowe所说,使用LOAD DATA INFILE语法。 Another SO answer建议使用基于Windows的HeidiSQL通过UI制作语句,以获得正确的映射。

答案 4 :(得分:0)

只是不要使用INSERT的多值版本。每行使用1个INSERT语句,即

INSERT INTO tbl VALUES(...);
INSERT INTO tbl VALUES(...);
INSERT INTO tbl VALUES(...);