php mysql批量或批量更新多列和多行但如果列不为空则不更新

Posted

技术标签:

【中文标题】php mysql批量或批量更新多列和多行但如果列不为空则不更新【英文标题】:php mysql bulk or batch update multiple columns and multiple rows but not if column is not empty 【发布时间】:2016-06-13 20:34:07 【问题描述】:

我有这个案例样式更新。此示例仅更新 3 行,但在实际应用中可能一次更新数百或数千条记录。

UPDATE table_name 
SET 
col_1 = CASE id 
WHEN 555555 THEN '43333' 
WHEN 555556 THEN '43334'
WHEN 555557 THEN '43335'
END, 
col_2 = CASE id 
WHEN 555555 THEN '893' 
WHEN 555556 THEN '893'
WHEN 555557 THEN '893'
END, 
col_3 = CASE id 
WHEN 555555 THEN '2016-06-09 06:03:00' 
WHEN 555556 THEN '2016-06-09 06:04:00'
WHEN 555557 THEN '2016-06-09 06:05:00'
END, 
col_4 = CASE id 
WHEN 555555 THEN '37064896499' 
WHEN 555556 THEN '37064896500'
WHEN 555557 THEN '37064896501'
END, 
col_5 = CASE id 
WHEN 555555 THEN '93270106785000243103' 
WHEN 555556 THEN '93270106785000243104'
WHEN 555557 THEN '93270106785000243105'
END, 
col_6 = CASE id 
WHEN 555555 THEN now() 
WHEN 555556 THEN now()
WHEN 555557 THEN now()
END, 
col_7 = CASE id 
WHEN 555555 THEN '93' 
WHEN 555556 THEN '94'
WHEN 555557 THEN '95'
END, 
col_8 = CASE id 
WHEN 555555 THEN '270' 
WHEN 555556 THEN '271'
WHEN 555557 THEN '272'
END 
WHERE id IN (555555,555556,555557)

我想知道是否可以对其进行操作,以便它不会在每种情况下都将数据写入列并记录该列是否已经有数据(如果它是日期列,则不要更新日期,如果它是0000-00-00 00:00:00 以外的东西。

我是否必须编辑每一行 WHEN 或在最后显示 WHERE id IN (555555) 的地方编辑一次?

php 脚本构建所有案例,最后在一个查询中批量更新所有记录。

无论如何,这个怎么样(这对我想要完成的工作更好).....如果只有 1 列有数据,例如 col_1 有数据,则不要更新 8 列中的任何一个?

更新

这是我在提出其中一项建议后得到的,但仍然无法正常工作。只在 col_1 上尝试,直到我做对了,然后我会做 2 到 8。

UPDATE table_name
SET 
col_1 = CASE col_1 WHEN col_1<>'' THEN
    CASE id 
        ".$col_1_loop."
    END
ELSE col_9 = CASE col_9 WHEN col_9<>'' THEN
    CASE id 
        ".$col_1_loop."
    END
END,
col_2 = CASE id
    ".$col_2_loop."
END,
col_3 = CASE id
    ".$col_3_loop."
END,
col_4 = CASE id
    ".$col_4_loop."
END,
col_5 = CASE id
    ".$col_5_loop."
END,
col_6 = CASE id
    ".$col_6_loop."
END,
col_7 = CASE id
    ".$col_7_loop."
END,
col_8 = CASE id
    ".$col_8_loop."
END
WHERE id IN (".$id_loop.")

如果 col_1 不为空,则将数据放入 col_9, 如果 col_2 不为空,则 col_2 转到 col_10, 如果 col_3 的日期和时间不为零,则 col_3 转到 col_11, 如果 col_4 不为空,则 col_4 转到 col_12, 如果 col_5 不为空,则 col_5 转到 col_13, 如果 col_6 的日期和时间不为零,则 col_6 转到 col_14, 如果 col_7 不为空,则 col_7 转到 col_15, 如果 col_8 不为空,则 col_8 转到 col_16

【问题讨论】:

这些值,你从哪里得到的?也许您可以使用不同的方法进行更新,使用 select、join、...中的 update... 这个查询对于解析、维护和理解是绝对的谋杀。为什么不针对 N 更新进行 N 次查询,无论如何更新应该不会超过几分之一毫秒,或者如果您确实有数千行,请创建一个临时表并针对它执行 UPDATE 连接。为了您自己和他人的理智,不要这样做 我们可以接受每 10,000 条记录 200 毫秒(0.2 秒)。只是希望我不必对表格进行预先检查以了解已填充的内容,因为这样每 10,000 行就需要超过 10 分钟。 :( 【参考方案1】:

在 where 子句中添加不更新的条件,例如:

UPDATE table_name 
    SET 
    col_1 = CASE id 
    WHEN 555555 THEN '43333' 
    WHEN 555556 THEN '43334'
    WHEN 555557 THEN '43335'
    END, 
    col_2 = CASE id 
    WHEN 555555 THEN '893' 
    WHEN 555556 THEN '893'
    WHEN 555557 THEN '893'
    END, 
    ......
    .....
    col_8 = CASE id 
    WHEN 555555 THEN '270' 
    WHEN 555556 THEN '271'
    WHEN 555557 THEN '272'
    END 
    WHERE id IN (555555,555556,555557)
    AND (col_1 is not null or col_2 is not null ........ or col_8 is not null)

【讨论】:

【参考方案2】:

你也可以使用嵌套的 CASE

    UPDATE table_name 
    SET 
    col_1 = CASE col_1 WHEN col1 is null THEN
                            CASE id 
                            WHEN 555555 THEN '43333' 
                            WHEN 555556 THEN '43334'
                            WHEN 555557 THEN '43335'
                            END
                        ELSE col_1
                        END, 
    ......
    ......
    col_9 = CASE col_1 WHEN col1 is null THEN
                            CASE id 
                            WHEN 555555 THEN '43333' 
                            WHEN 555556 THEN '43334'
                            WHEN 555557 THEN '43335'
                            END
                        ELSE  'YOUR_DATA_FOR_COL9'
                        END, 

    WHERE id IN (555555,555556,555557)

【讨论】:

你能帮我解决这个嵌套案例吗?如果 col_1 有数据,如果我希望它把数据放在 col_9 中,我该如何编写 ELSE。查看更新的问题。你不是说不为空吗?但是 null 或 not null 不起作用,所以我将向您展示我在那里使用的内容。你也不必在为空之前重复列名吗?

以上是关于php mysql批量或批量更新多列和多行但如果列不为空则不更新的主要内容,如果未能解决你的问题,请参考以下文章

怎样批量将excel中多行的数据合并为一行,并且自动换行?

excel统计每个数据出现次数 多行多列

SQL 多行多列数据清洗合并为一行

MySQL 数据库结构:多列或多行

LaTeX表格tabular合并多行、多列

将日期时间列值批量转换和更新为 UNIX 时间戳?