【问题标题】:Update multiple rows with multiple values and multiple conditions mysql用多个值和多个条件mysql更新多行
【发布时间】:2012-01-13 08:37:51
【问题描述】:

我面临一个复杂的 SQL 查询情况。任务是更新多行,具有多个值和多个条件。以下是我要更新的数据; 要更新的字段:“sales”,条件字段:“campid”和“date”:

if campid = 259 and date = 22/6/2011 then set sales = $200
else if campid = 259 and date = 21/6/2011 then set sales = $210
else if campid = 260 and date = 22/6/2011 then set sales = $140
else if campid = 260 and date = 21/6/2011 then set sales = $150

我想在一个查询中更新所有这些。

【问题讨论】:

  • 投了反对票,没有评论。如果有人还不知道交易,我认为这是一个合理的问题。
  • 由 Trevedhek 提供的stackoverflow.com/a/34866431/12229366 提供了更好的解决方案

标签: mysql


【解决方案1】:

试试这个:

UPDATE your_table SET sales = 
CASE 
    WHEN campid = 259 AND date = 22/6/2011 THEN 200
    WHEN campid = 259 AND date = 21/6/2011 THEN 210
    WHEN campid = 259 AND date = 22/6/2011 THEN 140
    WHEN campid = 259 AND date = 21/6/2011 THEN 150
    ELSE sales
END

我当然不知道日期字段是真的 DATE 还是 DATETIME,所以我留下了查询显示你可以做什么,但也许你必须根据数据类型修复日期比较。 如果日期字段是 DATE(应该如此),您可以写 AND date = '2011-06-22' 等等。
注意ELSE条件:必须避免不属于其他情况的记录被设置为NULL。

【讨论】:

  • 我在我的问题中使用了这个例子,它有效。很长一段时间后,我得出结论,这种类型的查询在少量数据上表现最好。如果表有数百万条记录,那么使用参数中的主键一次更新一条记录,可以节省大量时间,从而产生更好的性能。
  • 谢谢,我拯救了这个夜晚
【解决方案2】:

与其编写一个过于复杂和耗时的 sql 查询,我相信您最好花时间编写一个数据访问对象来处理基于每条记录的这些相当简单的操作。这使得代码的后期维护以及使用数据访问对象开发新代码比一次性使用复杂的 sql 查询要容易得多。

【讨论】:

    【解决方案3】:

    您当然不应该在单个查询中执行这些操作。相反,如果您的目标是同时以原子方式更新它们,您应该在单个事务中发出多个UPDATE 语句。

    你没有说你使用哪个 MySQL 版本,也没有说哪个存储引擎。假设 InnoDB - 这是 MySQL 最新版本中的标准,通常应该用于事务系统 - 并且假设您从命令行客户端执行此操作,您会

    mysql> set autocommit=0;
    mysql> UPDATE ....;
    mysql> UPDATE ....;
    mysql> ...
    mysql> commit;
    

    如果您愿意,可以通过重复第一行来重新启用自动提交,但值为1

    mysql> set autocommit=1;
    

    【讨论】:

    • imo,这不是回答 OP 的要求
    • 我谦虚地不同意。问题中提出的 If-elseif-elseif 等构造,再加上他想要同时更新所有字段的声明正是我的答案。当然,如果确实(!)需要一个语句,还有其他方法可以做到这一点。
    • 丹尼尔是正确的。我在为某个执行请求多个条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    相关资源
    最近更新 更多