SQL - Perbarui beberapa catatan dalam satu kueri

132

Saya punya tabel - konfigurasi . Skema: config_name | config_value

Dan saya ingin memperbarui beberapa catatan dalam satu permintaan. Saya coba seperti itu:

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

tapi kueri itu salah :(

Bisakah kamu membantuku?

pengguna3022527
sumber
1
Database apa yang Anda gunakan?
Hart CO
Saya menggunakan database MySQL.
user3022527
Pembaruan dari Select mungkin jawabannya stackoverflow.com/questions/2334712/…
Jonathan Benn

Jawaban:

167

Coba sintaks pembaruan multi-tabel

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

Ini demo SQLFiddle

atau pembaruan bersyarat

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

Ini demo SQLFiddle

peterm
sumber
1
Yee, tidak apa-apa tapi bagaimana ketika saya wolud ingin memperbarui 16 catatan dalam satu permintaan? Saya harus menggunakan JOIN x 16?
user3022527
19
Anda harus menyebutkan perincian penting dalam pertanyaan Anda. Pokoknya lihat jawaban yang diperbarui untuk solusi lain (pembaruan bersyarat).
peterm
1
Apa itu t1 dan t2 dalam contoh Anda?
Paul Brewczynski
1
Halo juga untuk Anda @PaulBrewczynski. Ini adalah alias tabel dan dapat ditulisconfig AS t1 jika ASopsional.
peterm
@peterm: tautan SQLFiddle rusak. Jika tidak, teknik pemutakhiran bersyarat berfungsi dengan baik. Terima kasih!
Jonathan Benn
142

Anda dapat mencapainya dengan INSERT seperti di bawah ini:

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

Ini memasukkan nilai-nilai baru ke dalam tabel, tetapi jika kunci utama digandakan (sudah dimasukkan ke dalam tabel) nilai-nilai yang Anda tentukan akan diperbarui dan catatan yang sama tidak akan dimasukkan kedua kalinya.

camille khalaghi
sumber
26
hack yang cukup pintar. Aku kagum.
Blaise
6
Tidak didukung untuk Postgres, lihat: stackoverflow.com/questions/1109061/…
kevzettler
Juga, ini adalah cara yang bagus untuk mengubah sedikit CSV (atau banyak) menjadi sisipan tabel / pembaruan / upsert dengan beberapa pengeditan teks kecil!
wulftone
6
Ini adalah solusi MySQL, bukan Postgres atau MSSQL.
Rz Mk
1
Ini akan meningkatkan id peningkatan otomatis, bahkan jika catatan tidak dimasukkan atau diperbarui
Timo Huovinen
15

dalam kasus saya, saya harus memperbarui catatan yang lebih dari 1000, untuk ini daripada memukul permintaan pembaruan setiap kali saya lebih suka ini,

   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 adalah Id pengguna dan untuk id pengguna itu saya masing-masing harus memperbarui base_id 999 dan 88. Ini berfungsi untuk saya.

vaibhav kulkarni
sumber
Salah satu yang terbaik di sini, Bekerja sangat baik untuk saya.
Shahrukh Anwar
7

mungkin bagi seseorang itu akan bermanfaat

untuk Postgresql 9.5 berfungsi sebagai pesona

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 ini memperbarui catatan yang ada dan menyisipkan jika yang baru (2 in 1)

Oleg Sobchuk
sumber
1
Seperti yang saya lihat, id adalah pk untuk tabel sesuai permintaan Anda. Misalkan ada 2 kolom atau lebih yang dianggap sebagai pk (kunci komposit) ... Dalam hal ini apa yang harus menjadi cara yang benar untuk memeriksa konflik.
Sritam Jagadev
6

Solusi Camille berhasil. Mengubahnya menjadi fungsi PHP dasar, yang menulis pernyataan SQL. Semoga ini bisa membantu orang lain.

    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;
    }
adamk
sumber
5

bukannya ini

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

kamu bisa memakai

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');
Shuhad zaman
sumber
3

Jalankan kode di bawah ini untuk memperbarui n jumlah baris, di mana ID Induk adalah id yang ingin Anda dapatkan datanya dan Id anak adalah id yang perlu diperbarui sehingga Anda hanya perlu menambahkan id induk dan id anak untuk memperbarui semua baris yang Anda butuhkan menggunakan skrip kecil.

    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])
Harrish Selvarajah
sumber
2

Dengan asumsi Anda memiliki daftar nilai untuk diperbarui dalam spreadsheet Excel dengan config_value dalam kolom A1 dan config_name di B1 Anda dapat dengan mudah menulis kueri di sana menggunakan rumus Excel seperti

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

Ivar
sumber
1

Jalankan kode di bawah ini jika Anda ingin memperbarui semua catatan di semua kolom:

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

dan jika Anda ingin memperbarui semua kolom pada baris tertentu maka jalankan kode di bawah ini:

update config set column1='value',column2='value'...columnN='value' where column1='value'
Jason Clark
sumber
3
bagaimana jika nilai berbeda di baris yang berbeda? misalnya staf UPDATE SET gaji = 1125 WHERE name = 'Bob'; Staf UPDATE SET gaji = 1200 WHERE name = 'Jane'; Staf UPDATE SET gaji = 1100 WHERE name = 'Frank'; Staf UPDATE SET gaji = 1175 WHERE name = 'Susan'; Staf UPDATE SET gaji = 1150 WHERE name = 'John';
Abdullah Nurum