web-dev-qa-db-ja.com

SQL - 1回のクエリーで複数のレコードを更新

テーブル - config があります。スキーマ:config_name | config_value

そして、1回のクエリで複数のレコードを更新したいと思います。私はそのようにします:

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

しかし、そのクエリは間違っています:(

手伝って頂けますか?

102
user3022527

複数テーブルの更新構文を試してください

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

これはSQLFiddledemoです。

または条件付き更新

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

これはSQLFiddledemoです。

127
peterm

以下のように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);

これは新しい値をテーブルに挿入しますが、主キーが重複している(すでにテーブルに挿入されている)場合、指定した値は更新され、同じレコードは2回挿入されません。

111

私の場合は、これを好むたびにupdateクエリを押すのではなく、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に更新する必要があります。

8

おそらく誰かにとってそれは役に立つでしょう

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 in 1)

5
Oleg Sobchuk

すべての列のすべてのレコードを更新したい場合は、以下のコードを実行してください。

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

特定の行のすべての列を更新したい場合は、以下のコードを実行します。

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

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
adamk

これの代わりに

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');
0
Shuhad zaman

config_value A1 および config_name in B1 でExcelスプレッドシートの更新する値の一覧があると仮定すると、Excel式を使用して簡単にクエリを記述できます。好き

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

0
Ivar