我正在处理一个项目,我必须更新两个不同表中的字段。首先,我使用 .csv 文件读取特定字段的值,然后检查 if 语句中的值,然后进行更新。以前在旧代码中很容易,因为我只有一个表和一个字段要更新,现在我有两个不同的表和两个字段。只做更新很容易,但我有超过 15000 条记录。我想知道最有效的方法是什么?如果我放置两个单独的查询并运行两次更新,那么将运行近 30,000 条记录。有什么办法可以立即做到这一点?如果不是,运行这些更新的最佳方法是什么?这是我用来在 ColdFusion 服务器上运行更新的代码:
<cfset updateFile = "C:\MyFiles\Records.csv">
<cffile action="read" file="#updateFile#" variable="recordsFile">
<cfset myarray = ListToArray(recordsFile, chr(13))>
<cfset cnt = ArrayLen(myarray)>
<cfloop index="i" from="1" to=#(cnt)# step="1">
<cfif len(trim(myarray[i])) GT 0>
<cfset myrow = #replace(myarray[i],chr(10),'')#>
<cfset myrow = ListToArray(myrow,",",true)>
<cfif #myrow[23]# EQ '1'>
<cfset #myrow[23]# = 'A'>
</cfif>
<cfif #myrow[23]# EQ '2'>
<cfset #myrow[23]# = 'B'>
</cfif>
<cfif #myrow[23]# EQ '3'>
<cfset #myrow[23]# = 'D'>
</cfif>
<cfquery name="UpdateRecords" datasource="test">
Update Users
Set FiledCode = '#myrow[23]#'
Where User_Number = #myrow[1]#
</cfquery>
<cfoutput>#myrow[1]#</cfoutput><br>
</cfif>
</cfloop>
在上面您可以看到我的旧代码的外观,现在我必须再添加一个表并更新该表中的文件,但仍然从数组中不同位置的同一文件 (Records.csv) 中读取信息。我以前做过更新/插入,但从来没有大量记录。现在我必须要提高效率并找到最佳方法。如果您对此问题有任何建议,请告诉我。谢谢。
最佳答案
另一种解决方案。正如您所说,记录可以更高(高达 30K),存储过程似乎是更好的选择。您可以按如下方式进行:
首先使用 cfftp
将 CSV
文件上传到 MySQL 服务器上的某个位置(如果 CF 和 MySQL 位于不同的位置)。
如果 MySQL 与 CF 在同一位置,则可以跳过上述步骤。
创建一个存储过程,用于使用其中的所需逻辑更新所需的表。
大致思路如下:
创建一个临时表,比如 temp_update_table
,其中包含您需要的列。像这样:
CREATE TEMPORARY TABLE temp_update_table (meta_key, meta_value)
现在使用 LOAD DATA INFILE
将 csv 数据插入临时表,如下所示:
LOAD DATA INFILE 'your_csv_pathname'
INTO TABLE temp_update_table FIELDS TERMINATED BY ';' (meta_key, meta_value);
然后像这样更新所需的表:
UPDATE "table"
INNER JOIN temp_update_table on temp_update_table.meta_key = "table".meta_key
SET "table".meta_value = temp_update_table.meta_value;
DROP TEMPORARY TABLE temp_update_table;
CSV上传完成后,使用cfstoredproc
标签调用上述存储过程。它会更有效率。 Reference
更新
使用存储过程的一些好处包括:
- 可维护性:您无需更改程序中的逻辑 需要编辑 app1、app2 和 app3 调用。
- 安全/访问控制:与控制谁可以访问哪些表或哪些表行相比,更容易担心谁可以调用预定义过程。
- 性能 (1):如果您的应用与您的应用不在同一台服务器上 数据库,而您正在做的事情涉及多个查询,使用 过程通过涉及单个调用来减少网络开销 数据库,而不是有多少查询就有多少调用。在您的情况下,使用内联查询将访问数据库服务器 30K 次(对于 30K 条记录)。
- 性能 (2):过程的查询计划通常被缓存,
允许您一次又一次地重复使用它,而无需重新准备它。
关于mysql - 更新两个不同表中字段的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37212462/