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


132

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

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

手伝って頂けますか?


1
どのデータベースを使用していますか?
Hart CO

MySQLデータベースを使用しています。
user3022527 2013年

選択からのアップデートは、回答かもしれませんstackoverflow.com/questions/2334712/...
ジョナサンベン

回答:


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
ええ、それで結構ですが、1つのクエリで16レコードを更新したい場合はどうなりますか?JOIN x 16を使用する必要がありますか?
user3022527 2013年

19
最初に、質問でそのような重要な詳細を説明する必要があります。とにかく、別のソリューションの更新された回答を参照してください(条件付き更新)。
peterm 2013年

1
あなたの例のt1とt2は何ですか?
Paul Brewczynski、2015年

1
こんにちは、@ PaulBrewczynskiです。これらはテーブルエイリアスでありconfig AS t1ASはオプションで記述できます。
peterm 2015年

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

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


26
かなりスマートなハック。びっくりしました。
2016年

6
Postgresのためにサポートされていません参照してください。stackoverflow.com/questions/1109061/...
kevzettler

また、ちょっとしたテキスト編集で、CSVの少し(または多く)をテーブルの挿入/更新/アップサートに変換するのに最適な方法です!
wulftone 16

6
これはMySQLソリューションであり、PostgresやMSSQLではありません。
Rz Mk

1
これにより、レコードが挿入または更新されていなくても、
自動

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を更新する必要があります。これは私にとってはうまくいきます。


ここで最高の1つ、私にとってはうまくいきました。
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 in 1)


1
ご覧のように、idはクエリごとにテーブルのpkです。pk(複合キー)と見なされる列が2つ以上あるとします。この場合、競合をチェックする正しい方法は何でしょうか。
Sritam Jagadev 2017

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_value列内のA1CONFIG_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 staff SET salary = 1125 WHERE name = 'Bob'; UPDATEスタッフSET給与= 1200 WHERE名前= 'Jane'; UPDATEスタッフSET給与= 1100 WHERE名前= 'フランク'; UPDATEスタッフSET給与= 1175 WHERE名前= 'スーザン'; UPDATEスタッフSET給与= 1150 WHERE名前= 'John';
Abdullah Nurum
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.