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


132

我有表配置。架构: 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';

但是那个查询是错误的:(

你能帮助我吗?


1
您正在使用哪个数据库?
哈特CO

我正在使用MySQL数据库。
user3022527 2013年

Answers:


167

尝试使用多表更新语法

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演示


1
是的,这很好,但是当我想一次查询更新16条记录时该怎么办?我应该使用JOIN x 16吗?
user3022527 2013年

19
首先,您应该在问题中提到这些重要的细节。无论如何,请参阅更新的答案以获取其他解决方案(有条件的更新)。
peterm

1
您的示例中的t1和t2是什么?
Paul Brewczynski,2015年

1
您好,@ PaulBrewczynski。这些是表别名,可以写config AS t1AS可选的地方。
peterm

@peterm:SQLFiddle链接已损坏。否则,条件更新技术的效果很好。谢谢!
乔纳森·本

142

您可以使用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);

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


26
一个非常聪明的技巧。我很惊讶。
布莱斯

6
不支持Postgres,请参阅:stackoverflow.com/questions/1109061/…–
kevzettler

另外,这是将一点点CSV(或很多)转换为表插入/更新/向上插入的好方法,并且需要进行一些小的文本编辑!
wulftone '16

6
这是一个MySQL解决方案,不是Postgres或MSSQL。
Rz Mk

1
即使未插入或更新记录,这也会增加自动增量ID
Timo Huovinen

15

就我而言,我必须更新超过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。


这里最好的之一,对我来说很棒。
Shahrukh Anwar

7

也许对某人有用

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)


1
如我所见,id是根据您的查询表的pk。假设有2列或更多列被视为pk(复合键)...在那种情况下应该是检查冲突的正确方法。
Sritam Jagadev

6

卡米尔的解决方案奏效。将其转换为基本的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;
    }

5

代替这个

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

3

执行下面的代码以更新n行,其中父ID是您要从中获取数据的ID,子ID是您需要更新的ID,因此只需添加父ID和子ID即可更新您需要使用小脚本的所有行。

    UPDATE [Table]
 SET couloumn1= (select couloumn1 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn2= (select couloumn2 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn3= (select couloumn3 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn4= (select couloumn4 FROM Table WHERE IDCouloumn = [PArent ID]),
 WHERE IDCouloumn IN ([List of child Ids])

2

假设你具有的值的列表来更新在Excel电子表格与CONFIG_VALUEA1CONFIG_NAMEB1可以很容易地写出了查询有使用Excel式像

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


1

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

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

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

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

3
如果不同行中的值不同怎么办?例如UPDATE人员SET薪水= 1125 WHERE名称='Bob'; 更新人员SET薪水= 1200,名字='Jane'; 更新人员SET工资= 1100,名称='Frank';更新人员SET工资= 1175,名称='Susan';更新人员SET工资= 1150,名字='John';
阿卜杜拉·努鲁姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.