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

use*_*527 114 sql records

我有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';
Run Code Online (Sandbox Code Playgroud)

但那个查询错了:(

你能帮助我吗?

pet*_*erm 143

尝试使用多表更新语法

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';
Run Code Online (Sandbox Code Playgroud)

这是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');
Run Code Online (Sandbox Code Playgroud)

这是SQLFiddle演示

  • 你应该首先在你的问题中提到这些重要的细节.无论如何,请看另一个解决方案的更新答案(条件更新). (15认同)
  • 是的,这很好,但是当我想在一个查询中更新 16 条记录时怎么办?我应该使用 JOIN x 16 吗? (3认同)
  • 你的例子中的 t1 和 t2 是什么? (2认同)
  • 也向你问好@PaulBrewczynski。这些是表别名,可以写成“config AS t1”,其中“AS”是可选的。 (2认同)

cam*_*ghi 126

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

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

  • 一个非常聪明的黑客.我很惊讶. (22认同)
  • Postgres不支持:http://stackoverflow.com/questions/1109061/insert-on-duplicate-update-in-postgresql (5认同)
  • 即使未插入或更新记录,这也会增加自动增量 id (5认同)
  • 这是一个MySQL解决方案,不是Postgres或MSSQL。 (4认同)
  • 此外,这是将一点 CSV(或大量)转换为表插入/更新/更新插入并进行一些小的文本编辑的好方法! (2认同)
  • 我从没想过这个.你是爱因斯坦,伙计!我向你致敬. (2认同)

Shu*_*man 11

而不是这个

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';
Run Code Online (Sandbox Code Playgroud)

您可以使用

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这一个。 (3认同)

小智 10

在我的情况下,我必须更新超过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)
Run Code Online (Sandbox Code Playgroud)

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

  • 这里最好的之一,对我来说非常有用。 (2认同)

小智 8

卡米尔的解决方案奏效了。把它变成了一个基本的 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;
    }
Run Code Online (Sandbox Code Playgroud)


Ole*_*huk 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
Run Code Online (Sandbox Code Playgroud)

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

  • 正如我所看到的,根据您的查询,id 是表的 pk。假设有 2 列或更多列被视为 pk(复合键)......在这种情况下,检查冲突的正确方法应该是什么。 (2认同)

Har*_*jah 6

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

 UPDATE [Table]
 SET column1 = (SELECT column1 FROM Table WHERE IDColumn = [PArent ID]),
     column2 = (SELECT column2 FROM Table WHERE IDColumn = [PArent ID]),
     column3 = (SELECT column3 FROM Table WHERE IDColumn = [PArent ID]),
     column4 = (SELECT column4 FROM Table WHERE IDColumn = [PArent ID]),
 WHERE IDColumn IN ([List of child Ids])
Run Code Online (Sandbox Code Playgroud)


Jas*_*ark 5

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

update config set column1='value',column2='value'...columnN='value';
Run Code Online (Sandbox Code Playgroud)

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

update config set column1='value',column2='value'...columnN='value' where column1='value'
Run Code Online (Sandbox Code Playgroud)

  • 如果不同行的值不同怎么办?例如 UPDATE Staff SET 工资 = 1125 WHERE name = 'Bob'; 更新员工 SET 工资 = 1200 WHERE name = 'Jane'; 更新员工 SET 工资 = 1100 WHERE name = 'Frank'; 更新员工 SET 工资 = 1175 WHERE name = 'Susan'; 更新员工 SET 工资 = 1150 WHERE name = 'John'; (5认同)

Eli*_*ant 5

更新 2021 / MySql v8.0.20 及更高版本

获得最多支持的答案建议使用VALUES现在已弃用的语法函数ON DUPLICATE KEY UPDATE。在 v8.0.20 中,您会收到 VALUES 函数的弃用警告:

INSERT INTO chart (id, flag)
VALUES (1, 'FLAG_1'),(2, 'FLAG_2')
ON DUPLICATE KEY UPDATE id = VALUES(id), flag = VALUES(flag);
Run Code Online (Sandbox Code Playgroud)

[HY000][1287]“VALUES 函数”已弃用,并将在未来版本中删除。请使用别名(INSERT INTO ... VALUES (...) AS 别名)并将 ON DUPLICATE KEY UPDATE 子句中的 VALUES(col) 替换为 alias.col

请改用新的别名语法:

INSERT INTO chart (id, flag) 
VALUES (1, 'FLAG_1'),(2, 'FLAG_2') AS aliased
ON DUPLICATE KEY UPDATE flag=aliased.flag;
Run Code Online (Sandbox Code Playgroud)