mysql - 更新两个不同表中字段的最有效方法?

标签 mysql sql csv coldfusion sql-update

我正在处理一个项目,我必须更新两个不同表中的字段。首先,我使用 .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),存储过程似乎是更好的选择。您可以按如下方式进行:
首先使用 cfftpCSV 文件上传到 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):过程的查询计划通常被缓存, 允许您一次又一次地重复使用它,而无需重新准备它。

Read this

关于mysql - 更新两个不同表中字段的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37212462/

相关文章:

python - 将 2 个 csv 数据集与 Python 合并为一个公共(public) ID 列 - 一个 csv 具有多个记录的唯一 ID

python - 在 python 中使用 argparse 将 csv 转换为 xml

java - 用户输入并附加到mysql

sql - 是否可以从 clickhouse 表中删除旧记录?

mysql - 如何计算Mysql中两个日期之间不包括周末(周六和周日)的天数?

SQL 大小写选择

javascript - Android - 将表单数据本地保存到 CSV

mysql - 值为NULL时无法添加外键约束?

mysql - 如果值存在于同一个表的另一列中,如何找到相应的列值

mysql - 使用多行的更新条件加入 MySQL