SQL - Bir sorguda birden çok kaydı güncelleyin


133

Tablo yapılandırmam var . Şema: config_name | config_value

Ve bir sorguda birden çok kaydı güncellemek istiyorum. Ben böyle deniyorum:

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

ancak bu sorgu yanlış :(

Bana yardım eder misiniz?


1
Hangi veritabanını kullanıyorsunuz?
Hart CO

MySQL veritabanı kullanıyorum.
user3022527

Yanıtlar:


169

Çoklu tablo güncelleme sözdizimlerinden birini deneyin

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

İşte SQLFiddle demosu

veya koşullu güncelleme

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

İşte SQLFiddle demosu


1
Yee, sorun değil ama bir sorguda 16 kaydı güncellemek istediğimde ne olur? JOIN x 16 kullanmalı mıyım?
user3022527

20
Sen gerektiğini ilk etapta söz konusu böyle önemli ayrıntıları söz. Her neyse, başka bir çözüm için güncellenmiş yanıtı görün (koşullu güncelleme).
peterm

1
Örneklerinizdeki t1 ve t2 nedir?
Paul Brewczynski

1
Sana da merhaba @PaulBrewczynski. Bunlar tablo takma adlarıdır ve isteğe bağlı olan config AS t1yerlerde yazılabilir AS.
peterm

@peterm: SQLFiddle bağlantıları koptu. Aksi takdirde, koşullu güncelleme tekniği harika çalışıyor. Teşekkürler!
Jonathan Benn

142

INSERT ile aşağıdaki şekilde başarabilirsiniz:

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

Bu tabloya yeni değerler ekler, ancak birincil anahtar yinelenirse (tabloya zaten eklenmişse) belirttiğiniz değerler güncellenir ve aynı kayıt ikinci kez eklenmez.


26
oldukça akıllı bir hack. Şaşırdım.
Blaise

6
Postgres için desteklenmez bkz: stackoverflow.com/questions/1109061/…
kevzettler

Ayrıca, küçük bir metin düzenleme ile biraz CSV'yi (veya daha fazlasını) bir tablo ekleme / güncelleme / yükseltmeye dönüştürmek için harika bir yoldur!
wulftone

6
Bu bir MySQL çözümüdür, Postgres veya MSSQL değildir.
Rz Mk

1
Bu, kayıt
eklenmemiş

15

benim durumumda 1000'den fazla olan kayıtları güncellemem gerekiyor, bunun için bunu her tercih ettiğimde güncelleme sorgusuna basmak yerine,

   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 kullanıcı kimlikleri ve bu kullanıcı kimlikleri için sırasıyla 999 ve 88 taban_kimliklerini güncellemem gerekiyor. Bu benim için çalışıyor.


Buradaki en iyilerden biri, benim için harika çalıştı.
Shahrukh Anwar

7

belki birisi için faydalı olur

Postgresql 9.5 için çekicilik görevi görüyor

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

bu SQL mevcut kaydı günceller ve yeniyse ekler (2'si 1 arada)


1
Gördüğüm gibi, sorgunuza göre tablo için id pk'dir. Pk (Bileşik anahtar) olarak kabul edilen 2 veya daha fazla sütun olduğunu varsayalım ... Bu durumda çakışmayı kontrol etmenin doğru yolu ne olmalıdır.
Sritam Jagadev

6

Camille'in çözümü işe yaradı. Bunu, SQL ifadesini yazan temel bir PHP işlevine dönüştürdü. Umarım bu başka birine yardımcı olur.

    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

bunun yerine

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

kullanabilirsiniz

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

3

N sayıda satırı güncellemek için aşağıdaki kodu yürütün; burada Ebeveyn Kimliği, verileri almak istediğiniz kimliktir ve Çocuk kimlikleri, güncellenmesi gereken kimliklerdir, bu nedenle yalnızca güncellemek için ebeveyn kimliği ve alt kimliklerini eklemeniz gerekir Küçük bir betik kullanarak ihtiyacınız olan tüm satırlar.

    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

Eğer bir Excel elektronik tabloda güncellenmesine değerlerin listesi var varsayarsak config_value sütununda A1 ve config_name içinde B1 kolayca bir Excel formülü gibi kullanarak sorguyu oraya yazabilir

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


1

Tüm sütunlardaki tüm kayıtları güncellemek istiyorsanız aşağıdaki kodu yürütün:

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

ve belirli bir satırın tüm sütunlarını güncellemek istiyorsanız, aşağıdaki kodu çalıştırın:

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

3
ya farklı satırda farklı bir değer varsa? örneğin GÜNCELLEME personeli SET maaş = 1125 WHERE name = 'Bob'; GÜNCELLEME personeli AYARLA maaş = 1200 WHERE adı = 'Jane'; GÜNCELLEME personel maaş ayarı = 1100 WHERE adı = 'Frank'; GÜNCELLEME personeli maaş ayarlayın = 1175 WHERE adı = 'Susan'; GÜNCELLEME personel maaşı SET = 1150 WHERE name = 'John';
Abdullah Nurum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.