在单个MySQL查询中更新多行

时间:2013-09-14 14:14:44

标签: mysql sql

我正试图这样做:

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。如何在一个查询中执行此操作?

6 个答案:

答案 0 :(得分:38)

这是最明确的方式

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')

答案 1 :(得分:4)

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

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

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

答案 2 :(得分: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')

答案 3 :(得分:1)

或者,当cases的构造变得太难以理解时,您可以/应该开始一个事务,然后按顺序执行更新。

这通常会导致更简单的sql,除非第一个语句创建的行然后在第二个语句不匹配时匹配。但是在你的例子中并非如此。

答案 4 :(得分:0)

我就这样做了:

UPDATE col1(静态值),col2(静态值)和col3(不同的值)WHERE col4具有不同的值AND col5是静态的。< / p>

$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'

答案 5 :(得分:-3)

UPDATE `wp_partners_tarif` SET  `name`="name1",`cena`="1",`comisiya`="11" WHERE `id`=2;
UPDATE `wp_partners_tarif` SET  `name`="name2",`cena`="2",`comisiya`="22" WHERE `id`=3;
UPDATE `wp_partners_tarif` SET  `name`="name2",`cena`="3",`comisiya`="33" WHERE `id`=4