我要求一次在表格中插入大约2500-3000行数据。我需要为MySQL和SQL Server执行此操作。所以我找到的可能的解决方案是
cfquery
内写cfloop
。cfloop
内使用cfquery
生成类似INSERT INTO tbl VALUES((),(),())
的sql语句。但问题是这个
语法是它一次只能插入1000条记录。我需要更多。有人能告诉我什么是处理这种情况的最佳方式?
答案 0 :(得分:5)
当您处理数千条记录时,小的增量延迟会立即开始加起来。逐个插入此行数将比发出BULK INSERT
语句花费更多时间,原因有多种,例如网络流量增加,内部数据库操作等等。
我将假设您正在接收文件中的数据。在这种情况下,这些是您需要采取的一般步骤:
BULK INSERT
语句,假设您使用的是SQL Server 2005或更高版本。我认为命令在2005和更新版本之间的工作方式有所不同,所以在尝试之前请检查语法。仔细规划整个插入过程是值得的,这样您就不会破坏正常的业务活动,并继续提供最好的服务和可用性。
作为结束思想,您应该使用不同的方法运行测试。逐个与批量一致,以确保您获得最佳性能。但是,我相信您总会发现批次或批量插入是可行的方法。他们将该功能添加到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(...);