【问题标题】:How to update sql column with an array?如何用数组更新sql列?
【发布时间】:2015-12-02 12:42:38
【问题描述】:

我输入了employee 表、emp_ids 数组和emp_joining_dates 数组。我的 Employee 表有 3 列,emp_idemp_nameemp_joining_date。表有超过 10k 条记录。我需要为输入数组中列出的emp_ids 更新emp_joining_date

我可以通过for循环实现,如下,

for 0 < i < emp_ids.length
 update employee set emp_joining_date = emp_joining_dates[i] where emp_id = emp_ids[i] //running update query multiple times
end

上述方法的问题是我正在使用多个查询来访问 db。我可以使用单个查询来实现相同的目标吗?如果是,怎么做?

注意:我的问题与this 不同。因为我想用数组值更新列值,而不是单个/静态值。

本题与编码无关,请忽略for-loop语法。与SQL查询优化有关。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可能会生成这样的 CASE 语句(假设您有 3 名员工要更新):

    UPDATE employee SET emp_joining_date = CASE emp_id 
        WHEN emp_ids[0] THEN emp_joining_dates[0] 
        WHEN emp_ids[1] THEN emp_joining_dates[1] 
        WHEN emp_ids[2] THEN emp_joining_dates[2] 
    END
    WHERE emp_id IN (emp_ids[0], emp_ids[1], emp_ids[2])
    

    你应该测试一下它是否真的能提供更好的性能......

    【讨论】:

    • 不可行,因为emp_joining_dates 长度可能不同
    • 如果 SQL 是动态生成的,这可能会起作用。
    • 所以您使用的客户端语言不是动态生成的 SQL?
    • 我突然想到一个想法:考虑到员工总数,一年只有365天,会有很多员工的加入日期相同吗?
    • 因此,您可以通过每个日期进行一次更新来稍微改进它,一次更新该日期的所有员工,因此 UPDATE employee SET emp_joining_date = the_joining_date WHERE emp_id IN (emp_ids[0], emp_ids[1 ], emp_ids[2])(the_joining_date 将是所有三名员工的加入日期)
    【解决方案2】:

    我可以立即看到两个选项(如下)。我假设每位员工的入职日期实际上都是独一无二的。

    临时表和连接

    1. 创建一个包含要上传的 ID 和数据的临时表。
    2. 加入两者并使用临时表更新现有表。
    3. 删除临时表。

    成组批量更新

    这是 André Kops 提供的方法。

    处理它:)

    第三种选择是只接受数千笔交易。这可能是一种不必要的优化(尽管我很欣赏人们总是渴望更好的代码)。

    【讨论】:

    • 创建新表和加入不等于for循环更新吗?
    • 不完全是。您可以在一个(或几个)事务中加载具有大型数据集的表。您的事务计数将小于每行的更新。但归根结底,您无法避免这样一个事实,即您有 10K 行可以用它们自己的唯一值更新每一行。所以无论哪种方式,它都不是你可以真正减少任何显着程度的东西。
    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多