MySQL'de Birden Fazla Güncelleme


388

Aynı anda birden çok satır ekleyebilirsiniz biliyorum, MySQL bir kerede birden fazla satır (bir sorguda olduğu gibi) güncellemek için bir yolu var mı?

Düzenleme: Örneğin aşağıdakilere sahibim

Name   id  Col1  Col2
Row1   1    6     1
Row2   2    2     3
Row3   3    9     5
Row4   4    16    8

Aşağıdaki tüm Güncelleştirmeleri tek bir sorguda birleştirmek istiyorum

UPDATE table SET Col1 = 1 WHERE id = 1;
UPDATE table SET Col1 = 2 WHERE id = 2;
UPDATE table SET Col2 = 3 WHERE id = 3;
UPDATE table SET Col1 = 10 WHERE id = 4;
UPDATE table SET Col2 = 12 WHERE id = 4;

Yanıtlar:


651

Evet, bu mümkün - DUPLICATE KEY UPDATE ÜZERİNDE INSERT ... kullanabilirsiniz.

Örneğinizi kullanma:

INSERT INTO table (id,Col1,Col2) VALUES (1,1,1),(2,2,3),(3,9,3),(4,10,12)
ON DUPLICATE KEY UPDATE Col1=VALUES(Col1),Col2=VALUES(Col2);

22
Hiçbir yinelenen yoksa o satırın eklenmesini istemiyorum. id ne yapmalı? çünkü id ile tabloları tutan başka bir siteden bilgi getiriyorum. Bu kimliğe göre değerler ekliyorum. site yeni kayıtlar varsa, o zaman diğer tüm bilgiler dışında sadece kimlikleri ve sayımı ekleyerek sona erecek. sadece ve eğer id için bir giriş varsa, o zaman güncelleme gerekir atlamak gerekir. ne yapmalıyım?
Jayapal Chandran

33
Not: Bu cevap aynı zamanda ID'nin birincil anahtar olduğunu varsayar
JM4,

11
@JayapalChandran, INSERT IGNORE'u ON DUPLICATE KEY UPDATE ile birlikte kullanmalısınız. dev.mysql.com/doc/refman/5.5/en/insert.html
Haralan Dobrev

16
@HaralanDobrev INSERT IGNORE kullanımı, yinelenmemiş kayıtları yine de ekler. hangi Jayapal kaçınmak istedi. INSERT IGNORE herhangi bir hatayı uyarır :( stackoverflow.com/questions/548541/…
Takehiro Adachi

2
Bu cevap, kimliğin benzersiz bir anahtar olduğunu varsayar (diğerlerinin söylediği gibi birincil olabilir), ancak daha da önemlisi, başka benzersiz anahtarların olmadığını varsayar. Varsa, eserlere bir anahtar atabilir.
Steve Horvath

129

Dinamik değerleriniz olduğundan, sütunların güncellenmesi için bir IF veya CASE kullanmanız gerekir. Biraz çirkinleşir, ama çalışmalı.

Örneğinizi kullanarak şöyle yapabilirsiniz:

UPDATE tablosu SET Col1 = VAKA kimliği 
                          1 NE ZAMAN 1 
                          NE ZAMAN 2 SONRA 2 
                          NE ZAMAN 4 SONRA 10 
                          ELSE Sütun1 
                        SON, 
                 Sütun2 = VAKA kimliği 
                          NE ZAMAN 3 SONRA 3 
                          NE ZAMAN 4 SONRA 12 
                          ELSE Sütun2 
                        SON
             NEREDE IN IN (1, 2, 3, 4);

belki dinamik güncelleme için yazmak çok hoş değil ama gövdenin işlevselliğine ilginç bir görünüm ...
me_

1
@ user2536953, dinamik güncelleme için de güzel olabilir. Örneğin, php döngüde bu çözümü kullanılabilir:$commandTxt = 'UPDATE operations SET chunk_finished = CASE id '; foreach ($blockOperationChecked as $operationID => $operationChecked) $commandTxt .= " WHEN $operationID THEN $operationChecked "; $commandTxt .= 'ELSE id END WHERE id IN ('.implode(', ', array_keys(blockOperationChecked )).');';
Boolean_Type

86

Soru eski, ama konuyu başka bir cevapla uzatmak istiyorum.

Demek istediğim, bunu başarmanın en kolay yolu, bir işlemle birden çok sorguyu sarmaktır. Kabul edilen cevap INSERT ... ON DUPLICATE KEY UPDATEgüzel bir hack'tir, ancak birinin dezavantajları ve sınırlamalarının farkında olması gerekir:

  • Söylendiği gibi, sorguları birincil anahtarları tabloda bulunmayan satırlarla başlatırsanız, sorgu yeni "yarı pişmiş" kayıtlar ekler. Muhtemelen istediğin bu değil
  • Varsayılan değeri olmayan boş olmayan bir tablonuz varsa ve sorguda bu alana dokunmak istemiyorsanız, "Field 'fieldname' doesn't have a default value"tek bir satır eklemeseniz bile MySQL uyarısı alırsınız . Sıkı olmaya karar verirseniz ve mysql uyarılarını uygulamanızdaki çalışma zamanı istisnalarına dönüştürürseniz sorun yaşarsınız.

INSERT ... ON DUPLICATE KEY UPDATEVaryant, "case / when / then" yan tümcesine sahip bir varyant ve işlemle naif bir yaklaşım da dahil olmak üzere önerilen üç varyant için bazı performans testleri yaptım . Python kodunu ve sonuçlarını buradan alabilirsiniz . Genel sonuç şudur: case ifadesi ile varyant, diğer iki varyanttan iki kat daha hızlıdır, ancak bunun için doğru ve enjeksiyon güvenli kod yazmak oldukça zordur, bu yüzden şahsen en basit yaklaşıma bağlı kalıyorum: işlemleri kullanma.

Düzenleme: Dakusan bulguları performans tahminlerimin oldukça geçerli olmadığını kanıtlıyor. Lütfen başka, daha ayrıntılı bir araştırma için bu cevaba bakınız .


İşlemleri kullanarak, çok güzel (ve basit) ipucu!
mTorres

Tablolarım InnoDB Tipi değilse ne olur?
TomeeNS

1
Birisi bunun için hangi işlemlerin nasıl yapılacağına dair bir bağlantı sağlayabilir mi? Ve / veya vaka bildirimli değişken için güvenli bir kod kodu mu?
François

1
Bu yazıda hız hakkında verilen bilgileri yanlış buluyorum. Bu konuyu aşağıdaki yazıya yazdım. stackoverflow.com/questions/3432/multiple-updates-in-mysql/…
Dakusan

1
@ Dakusan, harika cevap. Sonuçlarımı genişlettiğiniz, yorum yaptığım ve düzelttiğiniz için çok teşekkürler.
Roman Imankulov

72

Neden başka bir yararlı seçenek belirtilmediğinden emin değilim:

UPDATE my_table m
JOIN (
    SELECT 1 as id, 10 as _col1, 20 as _col2
    UNION ALL
    SELECT 2, 5, 10
    UNION ALL
    SELECT 3, 15, 30
) vals ON m.id = vals.id
SET col1 = _col1, col2 = _col2;

4
En iyisi bu. Özellikle yaptığım gibi başka bir SQL sorgudan güncelleme değerlerini çekiyorsanız.
v010dya

1
Bu, büyük miktarda sütun içeren bir tabloda güncelleme için harikaydı. Muhtemelen bu sorguyu gelecekte çok kullanacağım. Teşekkürler!
Casper Wilkes

Bu tür bir sorgu denedim. Ancak kayıtlar 30k ulaştığında Sınır sunucusu durdu. başka bir çözüm var mı?
Bhavin Chauhan

Harika görünüyor. Bunu birincil anahtarların güncellenmediği, ancak değiştirilecek sütunları tanımlamak için kullanılan bir WHERE yan tümcesi ile birleştirmeyi deneyeceğim.
nl-x

@BhavinChauhan Bu sorunu aşmak için join-select yerine geçici bir tablo kullanmayı denediniz mi?
nl-x

41

Aşağıdakilerin tümü InnoDB için geçerlidir.

3 farklı yöntemin hızını bilmek önemlidir.

3 yöntem vardır:

  1. INSERT: ON DUPLICATE KEY UPDATE ile ekle
  2. İŞLEM: Bir işlemdeki her kayıt için güncelleme yaptığınız yer
  3. DURUM: Bir GÜNCELLEME içindeki her farklı kayıt için bir vaka / ne zaman

Bunu yeni test ettim ve INSERT yöntemi benim için TRANSACTION yönteminden 6,7 kat daha hızlıydı. Hem 3.000 hem de 30.000 satırlık bir dizi denedim.

TRANSACTION yöntemi, yürütme sırasında sonuçları bellekte veya başka bir şeyde topluyor olsa da, her bir tek sorguyu çalıştırmaya devam etmelidir. TRANSACTION yöntemi hem çoğaltma hem de sorgu günlüklerinde oldukça pahalıdır.

Daha da kötüsü, VAKA yöntemiydi 41.1x / 30.000 kayıtları (daha yavaş İŞLEM daha 6.1x) w yavaş INSERT yönteminden daha. Ve MyISAM'de 75 kat daha yavaş. INSERT ve CASE yöntemleri ~ 1000 kayıtta bile kırıldı. 100 kayıtta bile, CASE yöntemi BARELY'dir.

Genel olarak, INSERT yönteminin hem en iyi hem de kullanımı en kolay olduğunu düşünüyorum. Sorgular daha küçüktür ve okunması daha kolaydır ve yalnızca 1 işlem sorgusunu alır. Bu hem InnoDB hem de MyISAM için geçerlidir.

Bonus şeyler:

INSERT varsayılan olmayan alan sorununa çözüm geçici olarak ilgili SQL modlarını kapatmak olur: SET SESSION sql_mode=REPLACE(REPLACE(@@SESSION.sql_mode,"STRICT_TRANS_TABLES",""),"STRICT_ALL_TABLES",""). Geri sql_modedöndürmeyi planlıyorsanız ilkini kaydettiğinizden emin olun .

Auto_increment'in INSERT yöntemini kullanarak arttığını söyleyen diğer yorumlara gelince, bu InnoDB'de olduğu gibi görünüyor, ancak MyISAM değil.

Testleri yapmak için kod aşağıdaki gibidir. Ayrıca php yorumlayıcı yükünü kaldırmak için .SQL dosyaları çıkarır

<?
//Variables
$NumRows=30000;

//These 2 functions need to be filled in
function InitSQL()
{

}
function RunSQLQuery($Q)
{

}

//Run the 3 tests
InitSQL();
for($i=0;$i<3;$i++)
    RunTest($i, $NumRows);

function RunTest($TestNum, $NumRows)
{
    $TheQueries=Array();
    $DoQuery=function($Query) use (&$TheQueries)
    {
        RunSQLQuery($Query);
        $TheQueries[]=$Query;
    };

    $TableName='Test';
    $DoQuery('DROP TABLE IF EXISTS '.$TableName);
    $DoQuery('CREATE TABLE '.$TableName.' (i1 int NOT NULL AUTO_INCREMENT, i2 int NOT NULL, primary key (i1)) ENGINE=InnoDB');
    $DoQuery('INSERT INTO '.$TableName.' (i2) VALUES ('.implode('), (', range(2, $NumRows+1)).')');

    if($TestNum==0)
    {
        $TestName='Transaction';
        $Start=microtime(true);
        $DoQuery('START TRANSACTION');
        for($i=1;$i<=$NumRows;$i++)
            $DoQuery('UPDATE '.$TableName.' SET i2='.(($i+5)*1000).' WHERE i1='.$i);
        $DoQuery('COMMIT');
    }

    if($TestNum==1)
    {
        $TestName='Insert';
        $Query=Array();
        for($i=1;$i<=$NumRows;$i++)
            $Query[]=sprintf("(%d,%d)", $i, (($i+5)*1000));
        $Start=microtime(true);
        $DoQuery('INSERT INTO '.$TableName.' VALUES '.implode(', ', $Query).' ON DUPLICATE KEY UPDATE i2=VALUES(i2)');
    }

    if($TestNum==2)
    {
        $TestName='Case';
        $Query=Array();
        for($i=1;$i<=$NumRows;$i++)
            $Query[]=sprintf('WHEN %d THEN %d', $i, (($i+5)*1000));
        $Start=microtime(true);
        $DoQuery("UPDATE $TableName SET i2=CASE i1\n".implode("\n", $Query)."\nEND\nWHERE i1 IN (".implode(',', range(1, $NumRows)).')');
    }

    print "$TestName: ".(microtime(true)-$Start)."<br>\n";

    file_put_contents("./$TestName.sql", implode(";\n", $TheQueries).';');
}

1
RAB'bin işini burada yapıyorsun;) Çok takdir ettim.
biber

MariaDB üzerinde 40k satır kullanarak GoLang ve PHP arasında bazı performans test, ben PHP üzerinde 2 sn ve golang üzerinde 6 saniyeden fazla alıyordu .... Eh, her zaman GoLang PHP daha hızlı çalışacağı söylendi !!! Yani, performansını artırmak için nasıl merak etmeye başladım ... INSERT kullanarak ... ÇİFT YÖNLÜ ANAHTAR GÜNCELLEME ... Ben Golang 0.74 sn ve PHP 0.86 sn var !!!!
Diego Favero

1
Kodumun amacı, zamanlama sonuçlarını dil veya kitaplıkların koduyla değil, SQL ifadeleriyle sınırlamaktır. GoLang ve PHP tamamen farklı şeyler için 2 ayrı dildir. PHP çoğunlukla sınırlı ve pasif çöp toplama ile tek bir iş parçacığı üzerinde tek bir çalışma komut dosyası ortamı içindir. GoLang, agresif çöp toplama ve birincil dil özelliklerinden biri olarak çoklu iş parçacığı içeren uzun süre çalışan derlenmiş uygulamalar içindir. Dil işlevselliği ve nedeni açısından zar zor farklı olabilirler. [Devamı]
Dakusan

Bu nedenle, testlerinizi çalıştırırken, hız ölçümlerini kesinlikle "Sorgu" fonksiyonu ile SQL deyimi için sınırlandırdığınızdan emin olun. Kaynak kodunun tam olarak sorgu çağrısı olmayan diğer bölümlerini karşılaştırmak ve optimize etmek, elma ve portakalları karşılaştırmak gibidir. Sonuçlarınızı bununla sınırlandırırsanız (dizelerin önceden derlenmiş ve kullanıma hazır olması), sonuçların çok benzer olması gerekir. Bu noktadaki herhangi bir fark, dilin kendisinin değil, dilin SQL kütüphanesinin hatasıdır. Benim düşünceme göre, DUPLICATE ON INSERT çözüm ve her zaman en iyi seçenek olacaktır. [Devamı]
Dakusan

GoLang hakkındaki yorumunuzun daha hızlı olması, bu dillerin ve tasarımlarının çok sayıda uyarısını veya nüansını dikkate almayan inanılmaz derecede geniş bir ifadedir. Java yorumlanmış bir dildir, ancak 15 yıl önce aslında bazı senaryolarda C hızıyla neredeyse eşleşebilir (ve hatta bazen yenebilir). Ve C, derleyicinin yanı sıra derlenmiş bir dildir ve en alt düzey sistem dillerinde en yaygın olanıdır. GoLang'ın ne yaptığını gerçekten çok seviyorum ve kesinlikle en yaygın sistemlerden biri ve optimize edilmiş olma gücü ve akışkanlığına sahip [Cont]
Dakusan

9

Geçici bir tablo kullanın

// Reorder items
function update_items_tempdb(&$items)
{
    shuffle($items);
    $table_name = uniqid('tmp_test_');
    $sql = "CREATE TEMPORARY TABLE `$table_name` ("
        ."  `id` int(10) unsigned NOT NULL AUTO_INCREMENT"
        .", `position` int(10) unsigned NOT NULL"
        .", PRIMARY KEY (`id`)"
        .") ENGINE = MEMORY";
    query($sql);
    $i = 0;
    $sql = '';
    foreach ($items as &$item)
    {
        $item->position = $i++;
        $sql .= ($sql ? ', ' : '')."({$item->id}, {$item->position})";
    }
    if ($sql)
    {
        query("INSERT INTO `$table_name` (id, position) VALUES $sql");
        $sql = "UPDATE `test`, `$table_name` SET `test`.position = `$table_name`.position"
            ." WHERE `$table_name`.id = `test`.id";
        query($sql);
    }
    query("DROP TABLE `$table_name`");
}

8
UPDATE table1, table2 SET table1.col1='value', table2.col1='value' WHERE table1.col3='567' AND table2.col6='567'

Bu senin için işe yaramalı.

MySQL kılavuzunda birden çok tablo için bir referans bulunmaktadır .


6

Neden kimse bir sorguda birden fazla ifadeden bahsetmiyor ?

Php, multi_querymysqli örneği yöntemini kullanın .

Gönderen php kılavuzuna

MySQL isteğe bağlı olarak bir deyim dizesinde birden çok deyimin bulunmasına izin verir. Tek seferde birden fazla ifade göndermek, istemci-sunucu gidiş-dönüşlerini azaltır, ancak özel işlem gerektirir.

30.000 raw güncellemesindeki diğer 3 yönteme kıyasla sonuç. @Dakusan'ın cevabına dayanan kodu burada bulabilirsiniz

İşlem: 5.5194580554962
Ekle: 0.20669293403625
Vaka: 16.474853992462
Çok: 0.0412278175354

Gördüğünüz gibi, birden çok deyim sorgusu en yüksek yanıttan daha verimlidir.

Bunun gibi bir hata mesajı alırsanız:

PHP Warning:  Error while sending SET_OPTION packet

max_allowed_packetMakinemde olan mysql yapılandırma dosyasını artırmanız /etc/mysql/my.cnfve daha sonra mysqld'yi yeniden başlatmanız gerekebilir.


Aşağıdaki tüm karşılaştırmalar INSERT testine göre yapılmıştır. Sadece işlem olmadan, öyleydi, aynı koşullarda testi yaptı ve 145x 300 satırlarda daha yavaş ve 753x 3000 satırlar için daha yavaş. Başlangıçta 30.000 satırla başlamıştım, ama kendime öğle yemeği yapmaya gittim ve geri döndüm ve hala devam ediyordu. Bu, bireysel sorguların çalıştırılması ve her birinin veritabanına ayrı ayrı yıkanmasının gülünç derecede pahalı olacağı anlamlıdır. Özellikle çoğaltma ile. Ancak işlemleri açmak büyük bir fark yaratır. 3.000 satırda 1.5x daha fazla ve 30.000 satırda 2.34x aldı . [devam]
Dakusan

Ama hızlı (işlemlerle) olma konusunda haklıydınız. Hem 3000 hem de 30.000 satırda INSERT yöntemi hariç her şeyden daha hızlıydı. Özel bir MySQL API çağrısında toplu olsalar bile, 30.000 sorgudan 1 sorgu çalıştırmanın daha iyi sonuçlarını elde etmenin kesinlikle bir yolu yoktur. Sadece 300 satır çalıştırıldığında, CASE yöntemiyle aynı grafik eğrisini izleyen diğer tüm yöntemlerden (sürprizime göre) çok daha hızlıydı. Bu daha hızlı olmak 2 yolla açıklanabilir. Bunlardan ilki, INSERT yönteminin "ON DUPLICATE KEY [devam]
Dakusan

UPDATE "hem" INSERT "hem de" UPDATE "'e neden olur. Diğeri ise SQL işlemcisinde dizin aramaları nedeniyle bir seferde yalnızca 1 satırı düzenlemek için daha az çalışma olması. ama ek test sağlam görünüyor. Aslında çoğaltma bu çağrıyı nasıl ele alacağından bile emin
değilim.Bu

Ben 41 saniye sürdü bir for döngüsü içinde bir hatayı revize etmek için bir masada 300 UPDATEs yapıyordum. Aynı GÜNCELLEŞTİRME sorgularını bir taneye koymak $mysqli->multi_query($sql)"0" saniye sürdü. Ancak, sonraki sorgular başarısız oldu, bu bana ayrı bir "program" yapmak neden oldu.
Chris K

Teşekkürler. Çoklu sorgular kullanarak bir dakikada yaklaşık 5 bin satır (daha fazla test etmedi) güncelleme başardı. Birisi bir PDO çözümü arıyorsa: stackoverflow.com/questions/6346674/…
Scofield

3

(Birden fazla) enjeksiyon komutunu önlemek için uygulanan MySQL'in 'güvenlik mekanizmasını' devre dışı bırakan 'çoklu ifade' adı verilen bir ayar vardır. MySQL'in 'mükemmel' uygulamasına tipik olarak, kullanıcının verimli sorgular yapmasını da engeller.

Burada ( http://dev.mysql.com/doc/refman/5.1/en/mysql-set-server-option.html ), ayarın C uygulaması hakkında bazı bilgilerdir.

PHP kullanıyorsanız, çoklu ifadeler yapmak için mysqli kullanabilirsiniz (Bence php bir süredir mysqli ile birlikte gönderildi)

$con = new mysqli('localhost','user1','password','my_database');
$query = "Update MyTable SET col1='some value' WHERE id=1 LIMIT 1;";
$query .= "UPDATE MyTable SET col1='other value' WHERE id=2 LIMIT 1;";
//etc
$con->multi_query($query);
$con->close();

Umarım yardımcı olur.


4
Bu, sorguları ayrı ayrı göndermekle aynıdır. Tek fark, hepsini tek bir ağ paketinde göndermenizdir, ancak UPDATE'ler yine de ayrı sorgular olarak işlenir. Daha iyisi onları bir işlemde sarmaktır, daha sonra değişiklikler bir kerede tabloya aktarılacaktır.
Marki555

3
Onları tek bir işlemde nasıl sarabilirim? Göster lütfen.
TomeeNS

@TomeeNS mysqli::begin_transaction(..)Sorguyu göndermeden önce ve mysql::commit(..)sonra kullanın . Veya sorgunun kendisinde START TRANSACTIONilk ve COMMITson ifade olarak kullanın.
Juha Palomäki

3

Eklemek istediğiniz kimlikleri size vermek için aynı tabloyu diğer adlandırabilirsiniz (satır satır güncelleme yapıyorsanız:

UPDATE table1 tab1, table1 tab2 -- alias references the same table
SET 
col1 = 1
,col2 = 2
. . . 
WHERE 
tab1.id = tab2.id;

Ayrıca, diğer tablolardan da güncelleme yapabileceğiniz açık görünmelidir. Bu durumda, güncelleme belirttiğiniz tablodan veri vererek "SELECT" ifadesi olarak iki katına çıkar. Sorgunuzda güncelleme değerlerini açıkça belirtiyorsunuz, böylece ikinci tablo etkilenmiyor.


2

Güncellemelerde birleştirmeleri kullanmak da ilginizi çekebilir, bu da mümkündür.

Update someTable Set someValue = 4 From someTable s Inner Join anotherTable a on s.id = a.id Where a.id = 4
-- Only updates someValue in someTable who has a foreign key on anotherTable with a value of 4.

Düzenleme: Güncellemekte olduğunuz değerler veritabanında başka bir yerden gelmiyorsa, birden fazla güncelleme sorgusu yayınlamanız gerekir.


1

Ve şimdi kolay yol

update speed m,
    (select 1 as id, 20 as speed union
     select 2 as id, 30 as speed union
     select 99 as id, 10 as speed
        ) t
set m.speed = t.speed where t.id=m.id

-1

kullanım

REPLACE INTO`table` VALUES (`id`,`col1`,`col2`) VALUES
(1,6,1),(2,2,3),(3,9,5),(4,16,8);

Lütfen aklınızda bulundurun:

  • id, birincil benzersiz bir anahtar olmalıdır
  • tabloya başvurmak için yabancı anahtarlar kullanırsanız, REPLACE sonra ekler siler, bu bir hataya neden olabilir

-3

Aşağıdakiler tek bir tablodaki tüm satırları güncelleyecektir

Update Table Set
Column1 = 'New Value'

Bir sonraki sütun, Column2 değerinin 5'ten fazla olduğu tüm satırları güncelleyecektir

Update Table Set
Column1 = 'New Value'
Where
Column2 > 5

Bütün yoktur Unkwntech birden fazla tablo güncelleme 'ın örneği

UPDATE table1, table2 SET
table1.col1 = 'value',
table2.col1 = 'value'
WHERE
table1.col3 = '567'
AND table2.col6='567'

-3

Evet .. DUPLICATE KEY UPDATE sql deyimi INSERT kullanılarak sözdizimi kullanılabilir: sözdizimi: INDET INDE table_name (a, b, c) DEĞERLER (1,2,3), (4,5,6) ON DUPLICATE KEY UPDATE a = DEĞERLERİ (a), b = DEĞERLERİ (b), c = DEĞERLERİ (c)


-5
UPDATE tableName SET col1='000' WHERE id='3' OR id='5'

Bu, aradığınızı başarmalıdır. Sadece daha fazla kimlik ekleyin. Test ettim.


-7
UPDATE `your_table` SET 

`something` = IF(`id`="1","new_value1",`something`), `smth2` = IF(`id`="1", "nv1",`smth2`),
`something` = IF(`id`="2","new_value2",`something`), `smth2` = IF(`id`="2", "nv2",`smth2`),
`something` = IF(`id`="4","new_value3",`something`), `smth2` = IF(`id`="4", "nv3",`smth2`),
`something` = IF(`id`="6","new_value4",`something`), `smth2` = IF(`id`="6", "nv4",`smth2`),
`something` = IF(`id`="3","new_value5",`something`), `smth2` = IF(`id`="3", "nv5",`smth2`),
`something` = IF(`id`="5","new_value6",`something`), `smth2` = IF(`id`="5", "nv6",`smth2`) 

// Sen sadece php gibi inşa

$q = 'UPDATE `your_table` SET ';

foreach($data as $dat){

  $q .= '

       `something` = IF(`id`="'.$dat->id.'","'.$dat->value.'",`something`), 
       `smth2` = IF(`id`="'.$dat->id.'", "'.$dat->value2.'",`smth2`),';

}

$q = substr($q,0,-1);

Böylece delik tablosunu tek bir sorgu ile güncelleyebilirsiniz


Ben downvote yoktu, ama itiraz İhtiyaç olmadığında zaman, set yapmaya düşünüyorum (ve hala bunu yapıyor sen ayarlarken somethingiçin something)
v010dya
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.