33

我正在尝试运行这个:

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。我怎样才能在一个查询中做到这一点?

4

5 回答 5

40

这是最清楚的方法

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')
于 2014-03-18T22:27:26.960 回答
4

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

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

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

于 2015-03-03T21:11:48.827 回答
3

你可以用CASE这个

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

IFMySQL仅)

UPDATE test 
SET col2 = IF(col1 = 'test1', 1, 3)
WHERE col1 IN ('test1', 'test2')
于 2013-09-14T14:16:13.540 回答
1

或者,当结构cases变得太不可读时,您可以/应该启动事务并按顺序进行更新。

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

于 2013-09-14T14:19:04.053 回答
0

我是这样做的:

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'
于 2017-11-25T14:26:47.087 回答