SQL - 在一个查询中更新多个记录

问题描述 投票:102回答:8

我有table - config。架构:config_name | config_value

我想在一个查询中更新多个记录。我试着这样:

UPDATE config 
SET t1.config_value = 'value'
  , t2.config_value = 'value2' 
WHERE t1.config_name = 'name1' 
  AND t2.config_name = 'name2';

但那个查询错了:(

你能帮助我吗?

sql records
8个回答
130
投票

尝试使用多表更新语法

UPDATE config t1 JOIN config t2
    ON t1.config_name = 'name1' AND t2.config_name = 'name2'
   SET t1.config_value = 'value',
       t2.config_value = 'value2';

这是SQLFiddle演示

或有条件的更新

UPDATE config
   SET config_value = CASE config_name 
                      WHEN 'name1' THEN 'value' 
                      WHEN 'name2' THEN 'value2' 
                      ELSE config_value
                      END
 WHERE config_name IN('name1', 'name2');

这是SQLFiddle演示


117
投票

您可以使用INSERT完成它,如下所示:

INSERT INTO mytable (id, a, b, c)
VALUES (1, 'a1', 'b1', 'c1'),
(2, 'a2', 'b2', 'c2'),
(3, 'a3', 'b3', 'c3'),
(4, 'a4', 'b4', 'c4'),
(5, 'a5', 'b5', 'c5'),
(6, 'a6', 'b6', 'c6')
ON DUPLICATE KEY UPDATE id=VALUES(id),
a=VALUES(a),
b=VALUES(b),
c=VALUES(c);

这会将新值插入表中,但如果主键重复(已插入表中),则指定的值将更新,并且第二次不会插入相同的记录。


8
投票

在我的情况下,我必须更新超过1000的记录,为此而不是每次我更喜欢这个时更新查询,

   UPDATE mst_users 
   SET base_id = CASE user_id 
   WHEN 78 THEN 999 
   WHEN 77 THEN 88 
   ELSE base_id END WHERE user_id IN(78, 77)

78,77是用户ID,对于那些用户ID,我需要分别更新base_id 999和88.这对我有用。


5
投票

也许对某人来说它会很有用

对于Postgresql 9.5来说,它是一种魅力

INSERT INTO tabelname(id, col2, col3, col4)
VALUES
    (1, 1, 1, 'text for col4'),
    (DEFAULT,1,4,'another text for col4')
ON CONFLICT (id) DO UPDATE SET
    col2 = EXCLUDED.col2,
    col3 = EXCLUDED.col3,
    col4 = EXCLUDED.col4

此SQL更新现有记录并插入新的(2合1)


3
投票

Camille的解决方案奏效了。把它变成了一个基本的PHP函数,它编写了SQL语句。希望这有助于其他人。

    function _bulk_sql_update_query($table, $array)
    {
        /*
         * Example:
        INSERT INTO mytable (id, a, b, c)
        VALUES (1, 'a1', 'b1', 'c1'),
        (2, 'a2', 'b2', 'c2'),
        (3, 'a3', 'b3', 'c3'),
        (4, 'a4', 'b4', 'c4'),
        (5, 'a5', 'b5', 'c5'),
        (6, 'a6', 'b6', 'c6')
        ON DUPLICATE KEY UPDATE id=VALUES(id),
        a=VALUES(a),
        b=VALUES(b),
        c=VALUES(c);
    */
        $sql = "";

        $columns = array_keys($array[0]);
        $columns_as_string = implode(', ', $columns);

        $sql .= "
      INSERT INTO $table
      (" . $columns_as_string . ")
      VALUES ";

        $len = count($array);
        foreach ($array as $index => $values) {
            $sql .= '("';
            $sql .= implode('", "', $array[$index]) . "\"";
            $sql .= ')';
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= "\nON DUPLICATE KEY UPDATE \n";

        $len = count($columns);
        foreach ($columns as $index => $column) {

            $sql .= "$column=VALUES($column)";
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= ";";

        return $sql;
    }

2
投票

如果要更新所有列中的所有记录,请执行以下代码:

update config set column1='value',column2='value'...columnN='value';

如果要更新特定行的所有列,请执行以下代码:

update config set column1='value',column2='value'...columnN='value' where column1='value'

0
投票

假设您有一个要在Excel电子表格中更新的值列表,其中A1列中的config_value和B1中的config_name,您可以使用Excel公式轻松地在那里写出查询

=CONCAT("UPDATE config SET config_value = ","'",A1,"'", " WHERE config_name = ","'",B1,"'")


0
投票

而不是这个

UPDATE staff SET salary = 1200 WHERE name = 'Bob';
UPDATE staff SET salary = 1200 WHERE name = 'Jane';
UPDATE staff SET salary = 1200 WHERE name = 'Frank';
UPDATE staff SET salary = 1200 WHERE name = 'Susan';
UPDATE staff SET salary = 1200 WHERE name = 'John';

您可以使用

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');
© www.soinside.com 2019 - 2024. All rights reserved.