MySQL - UPDATE beberapa baris dengan nilai berbeda dalam satu kueri

151

Saya mencoba memahami cara MEMPERBARUI beberapa baris dengan nilai berbeda dan saya tidak mengerti. Solusinya ada di mana-mana tetapi bagi saya tampaknya sulit untuk dipahami.

Misalnya, tiga pembaruan menjadi 1 kueri:

UPDATE table_users
SET cod_user = '622057'
    , date = '12082014'
WHERE user_rol = 'student'
    AND cod_office = '17389551'; 

UPDATE table_users
SET cod_user = '2913659'
    , date = '12082014'
WHERE user_rol = 'assistant'
    AND cod_office = '17389551'; 

UPDATE table_users
SET cod_user = '6160230'
    , date = '12082014'
WHERE user_rol = 'admin'
    AND cod_office = '17389551'; 

Saya membaca sebuah contoh, tetapi saya benar-benar tidak mengerti cara membuat kueri. yaitu:

UPDATE table_to_update
SET cod_user= IF(cod_office = '17389551','622057','2913659','6160230')
    ,date = IF(cod_office = '17389551','12082014')
WHERE ?? IN (??) ;

Saya tidak sepenuhnya jelas bagaimana melakukan kueri jika ada beberapa kondisi di WHERE dan dalam kondisi IF..Ada ide?

franvergara66
sumber
Apakah ini menjawab pertanyaan Anda? Beberapa Pembaruan di MySQL
PeterPan666

Jawaban:

207

Anda bisa melakukannya dengan cara ini:

UPDATE table_users
    SET cod_user = (case when user_role = 'student' then '622057'
                         when user_role = 'assistant' then '2913659'
                         when user_role = 'admin' then '6160230'
                    end),
        date = '12082014'
    WHERE user_role in ('student', 'assistant', 'admin') AND
          cod_office = '17389551';

Saya tidak mengerti format tanggal Anda. Tanggal harus disimpan dalam database menggunakan jenis tanggal dan waktu asli.

Gordon Linoff
sumber
bagaimana saya bisa melakukannya agar pembaruan dijalankan, jika catatan sudah ada
franvergara66
1
@ frangara66. . . Saya tidak mengerti komentar Anda. updates hanya mempengaruhi rekaman yang sudah ada.
Gordon Linoff
Maaf bahasa Inggris saya Pak, ketika saya mencoba memperbarui mysql, beri saya kesalahan: # 1062 - Gandakan entri 'XXX' untuk kunci 'PRIMARY'. Itu terjadi ketika saya mencoba memperbarui catatan dengan nilai yang sama dengan yang sudah dimilikinya, apakah ada cara untuk melewati pembaruan jika nilai saat ini sama dengan yang diperbarui?
franvergara66
1
@ frangara66. . . Anda mungkin memiliki masalah yang berbeda. Jika itu cod_useradalah kunci utama dan nilainya sedang diubah-ubah, maka beberapa pembaruan mungkin merupakan rute terbaik.
Gordon Linoff
1
ya, begitu, masalah sebenarnya adalah ada beberapa asisten, lalu ketika mencoba melakukan pembaruan, integritas kunci utama dilanggar. Terima kasih banyak atas waktunya.
franvergara66
120

MySQL memungkinkan cara yang lebih mudah dibaca untuk menggabungkan beberapa pembaruan menjadi satu kueri. Ini tampaknya lebih cocok dengan skenario yang Anda gambarkan, jauh lebih mudah dibaca, dan menghindari beberapa kondisi yang sulit diuraikan.

INSERT INTO table_users (cod_user, date, user_rol, cod_office)
VALUES
('622057', '12082014', 'student', '17389551'),
('2913659', '12082014', 'assistant','17389551'),
('6160230', '12082014', 'admin', '17389551')
ON DUPLICATE KEY UPDATE
 cod_user=VALUES(cod_user), date=VALUES(date)

Ini mengasumsikan bahwa user_rol, cod_officekombinasi tersebut adalah kunci utama. Jika hanya salah satu dari ini yang merupakan kunci utama , tambahkan bidang lainnya ke daftar PEMBARUAN. Jika tidak satu pun dari mereka adalah kunci utama (yang tampaknya tidak mungkin) maka pendekatan ini akan selalu membuat catatan baru - mungkin bukan yang diinginkan.

Namun, pendekatan ini membuat pernyataan yang disiapkan lebih mudah dibuat dan lebih ringkas.

Trevedhek
sumber
4
Terima kasih! Ini adalah apa yang saya cari untuk waktu yang lama, cara yang terlihat paling bersih, saya tidak dapat mengetahui sintaks ini, khususnya cod_user=VALUES(cod_user), ..., bahkan dari dokumen resmi MySQL 5.6
Yuriy Dyachkov
19
Catatan: Ini akan menambahkan baris baru jika kunci tidak ada di tabel yang menghasilkan rekaman yang tidak diinginkan.
Faraz
1
Sulit untuk menggunakan IODKU yang tidak pernah memasukkan, namun sangat elegan.
Tom Desp
Dan perhatikan bahwa pendekatan ini membutuhkan kunci primer diatur untuk tabel.
FlameStorm
5
Ini tidak berfungsi jika Anda menghilangkan kolom yang tidak boleh null, karena sql masih mencoba membuat catatan baru sebelum benar-benar beralih ke pembaruan.
Arno van Oordt
15

Anda dapat menggunakan CASEpernyataan untuk menangani beberapa skenario if / then:

UPDATE table_to_update 
SET  cod_user= CASE WHEN user_rol = 'student' THEN '622057'
                   WHEN user_rol = 'assistant' THEN '2913659'
                   WHEN user_rol = 'admin' THEN '6160230'
               END
    ,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
  AND cod_office = '17389551';
Hart CO
sumber
1
Anda membuat kesalahan ketik di akhir pernyataan CASE: Anda memiliki 2 koma di samping satu sama lain.
pmrotule
9
update table_name
set cod_user = 
    CASE 
    WHEN user_rol = 'student' THEN '622057'
    WHEN user_rol = 'assistant' THEN '2913659'
    WHEN user_rol = 'admin' THEN '6160230'?
    END,date = '12082014'

WHERE user_rol IN ('student','assistant','admin')
AND cod_office = '17389551';
Akshay Bhan
sumber
1

Untuk Memperluas jawaban @Trevedhek ,

Jika pembaruan harus dilakukan dengan kunci non-unik, 4 kueri akan dibutuhkan

CATATAN: Ini tidak aman untuk transaksi

Ini dapat dilakukan dengan menggunakan tabel temp.

Langkah 1: Buat kunci tabel temp dan kolom yang ingin Anda perbarui

CREATE TEMPORARY TABLE  temp_table_users
(
    cod_user varchar(50)
    , date varchar(50)
    , user_rol varchar(50)
    ,  cod_office varchar(50)
) ENGINE=MEMORY

Langkah 2: Masukkan nilai ke dalam tabel temp

Langkah 3: Perbarui tabel asli

UPDATE table_users t1
JOIN temp_table_users tt1 using(user_rol,cod_office)
SET 
t1.cod_office = tt1.cod_office
t1.date = tt1.date

Langkah 4: Jatuhkan tabel temp

Sab
sumber
0
UPDATE Table1 SET col1= col2 FROM (SELECT col2, col3 FROM Table2) as newTbl WHERE col4= col3

Berikut col4 & col1 ada di Table1. col2 & col3 ada di Tabel2
Saya mencoba memperbarui setiap col1 di mana col4 = col3 nilai berbeda untuk setiap baris

ankit giri
sumber
-1

Saya melakukannya dengan cara ini:

<update id="updateSettings" parameterType="PushSettings">
    <foreach collection="settings" item="setting">
        UPDATE push_setting SET status = #{setting.status}
        WHERE type = #{setting.type} AND user_id = #{userId};
    </foreach>
</update>

di mana PushSettings berada

public class PushSettings {

    private List<PushSetting> settings;
    private String userId;
}

itu bekerja dengan baik

ru51an
sumber
penulis ingin 1 kueri, jelas dia bisa melakukannya dengan foreach, yang akan membuat beberapa kueri
Hristo93