【问题标题】:Update multiple rows in a single MySQL query在单个 MySQL 查询中更新多行
【发布时间】:2017-11-25 22:26:47
【问题描述】:

我正在尝试运行这个:

UPDATE test 
SET col2=1 WHERE col1='test1', 
SET col2=3 WHERE col1='test2';

我得到的错误:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '

我的桌子:

CREATE TABLE `test` (
    `col1` varchar(30) NOT NULL,
    `col2` int(5) DEFAULT NULL,
    PRIMARY KEY (`col1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

这是关于第一行末尾的,。当我将其更改为; 时,它无法识别col2。我怎样才能在一个查询中做到这一点?

【问题讨论】:

  • Multiple Updates in MySQL 的可能重复项。你会在那里找到答案
  • 是的,我知道那个解决方案,但在我的情况下,每一行都已经存在于表中(不需要插入),所以它总是会在 DUPLICATE KEY UPDATE 上运行并使一切慢很多.
  • 我不明白你的意思。当您需要更新时使用INSERT 命令,仅此而已。如果你使用主键,它不会慢很多
  • 好的,如果没有人提出更好的解决方案,我会这样做,谢谢
  • 只是为了说清楚,如果你使用你的主键(不仅仅是 col1 = "test")它会很快。

标签: mysql sql


【解决方案1】:

这是最清晰的方法

UPDATE test
SET col2 = CASE col1
WHEN 'test1' THEN 1
WHEN 'test2' THEN 3
WHEN 'test3' THEN 5
END,
colx = CASE col1
WHEN 'test1' THEN 'xx'
WHEN 'test2' THEN 'yy'
WHEN 'test3' THEN 'zz'
END
WHERE col1 IN ('test1','test2','test3')

【讨论】:

  • WHERE部分不是不需要吗?
  • 没有 WHERE,CASE 将通过返回 null (可能不是任何人想要的)。我相信在没有 WHERE 的情况下添加“ELSE col2”是安全的,但会导致不必要的更新。
  • @Clox 也是,如果你不包括 WHERE 子句,那么 mysql 必须通过 each 行来检查。当然,这个示例不会出现性能问题,但想象一下,如果您有 1000 行并且您只想更新 2 行。
【解决方案2】:

考虑使用 INSERT-ODKU (ON DUPLICATE KEY UPDATE),因为它支持更新多行。

确保所有 PK 列的值都在 VALUES() 中。

在可行的情况下,使用来自从站的数据生成 SQL。

【讨论】:

    【解决方案3】:

    您可以在此使用CASE

    UPDATE test 
    SET col2 = CASE WHEN col1 = 'test1' THEN 1 ELSE 3 END 
    WHERE col1 IN ('test1', 'test2')
    

    或IF(仅限MySQL)

    UPDATE test 
    SET col2 = IF(col1 = 'test1', 1, 3)
    WHERE col1 IN ('test1', 'test2')
    

    【讨论】:

    • 我想在未来添加更多行和更多列:(我只是举了一个简单的例子来解决我的问题。
    • @Itay 你说的灵活是什么意思?
    • 我的意思是这样更新 100 行会非常困难。
    • @user2618929 然后构建动态sql。
    • @Itay 你能提供一个替代方案吗?
    【解决方案4】:

    或者,当带有cases 的构造变得难以阅读时,您可以/应该启动一个事务并按顺序进行更新。

    这通常会导致更直接的 sql,除非第一个语句创建的行然后在第二个语句不应该匹配的情况下匹配。但是在您的示例中并非如此。

    【讨论】:

      【解决方案5】:

      我就是这样做的:

      UPDATE col1(静态值)、col2(静态值)和col3(不同值)WHERE col4有不同的值AND col5是静态的。

      $someArray = ["a","b","c"];
      $anotherArray = [1,2,3];
      
      $sql = "UPDATE table SET col1 = '$staticValue1', col2 = '$staticValue2', col3 = CASE col4";
          $sqlEnd = " END WHERE col4 IN (";
          $seperator = ",";
          for ( $c = 0; $c < count($someArray); $c++ ) {
             $sql .= " WHEN " . "'" . $someArray[$c] . "'" . " THEN " . $anotherArray[$c];
             if ( $c === count($someArray) - 1 ) { 
                $separator = ") AND col5 = '$staticValue5'";
             }
              $sqlEnd .= "'" . $someArray[$c] . "'" . $seperator;
      
          }
          $sql .= $sqlEnd;
          $retval = mysqli_query( $conn, $sql);
          if(! $retval ) {
              /* handle error here */
          }
      

      MySql 查询的输出字符串是这样的:

      UPDATE table SET col1 = '1', col2 = '2', col3 = CASE col4 WHEN 'a' THEN 1 WHEN 'b' THEN 2 WHEN 'c' THEN 3 END WHERE col4 IN ('a','b','c') AND col5 = 'col5'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多