2011-04-20 26 views
80

Başka birindeki bilgilere dayanarak bir MySQL tablosunu güncelleştirmeye çalışıyorum.Başka bir değerden bir MySQL tablosunu güncelleştirin

Benim original tablo gibi görünüyor:

id | value 
------------ 
1 | hello 
2 | fortune 
3 | my 
4 | old 
5 | friend 

Ve tobeupdated tablo gibi görünür:

uniqueid | id | value 
--------------------- 
1  | | something 
2  | | anything 
3  | | old 
4  | | friend 
5  | | fortune 

Ben saklanan value (dizeleri dayalı original itibaren id ile tobeupdated yılında id güncellemek istiyorum VARCHAR(32) alanı). Ben çalışan bir sorgu var

uniqueid | id | value 
--------------------- 
1  | | something 
2  | | anything 
3  | 4 | old 
4  | 5 | friend 
5  | 2 | fortune 

, ama çok yavaş:

gibi güncellenmiş tablo umarım bakacağız

UPDATE tobeupdated, original 
SET tobeupdated.id = original.id 
WHERE tobeupdated.value = original.value 

Bu sonuçta benim CPU maxes ve bir zaman aşımına sebep olur Yapılan güncellemelerin sadece bir kısmı (eşleşecek birkaç bin değer var). value ile eşleşmenin yavaş olacağını biliyorum, ancak bu, onları eşleştirmem gereken tek veri.

Böyle değerleri güncellemenin daha iyi bir yolu var mı? Birleştirilmiş sonuçlar için üçüncü bir tablo oluşturabilirdim, eğer bu daha hızlı olursa?

MySQL - How can I update a table with values from another table?'u denedim, ancak gerçekten yardımcı olmadı. Herhangi bir fikir?

Bir MySQL acemi için şimdiden teşekkür ederiz!

+2

"Değeri" sütununda bir dizin var mı? – noodl

+0

Merhaba noodl; hayır, 'value' şu anda bir endekse sahip değil. – Superangel

cevap

164
UPDATE tobeupdated 
INNER JOIN original ON (tobeupdated.value = original.value) 
SET tobeupdated.id = original.id 

. Ancak, birden çok 'WHERE' koşulundan ziyade birleşimler için 'JOIN' sözdizimini tercih ediyorum, bunun daha kolay okunması daha kolay olduğunu düşünüyorum.

Yavaş çalışıyorsa, tablolar ne kadar büyük? Sen tobeupdated.value ve original.value

EDIT endeksler sahip olmalıdır: birleştirme her tabloları özdeş adlı key böyle id olarak varken steno biz de sorgu

UPDATE tobeupdated 
INNER JOIN original USING (value) 
SET tobeupdated.id = original.id 

USING kolaylaştırabilirsiniz olduğunu. Örneğin, bir eşittir - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join

+3

Teşekkürler wired00! Bu mükemmel çalışıyor. Tablolar oldukça büyüktür ('orijinal' 100.000+ giriş ve '10.000+'), bu yüzden sizin ve noodl'in indeksler hakkındaki tavsiyesini aldım ve tüm sorgu şimdi bir saniyenin altında bitiyor. Farkına inanamıyorum! Yardımın için çok teşekkürler; Çok şey öğrendim! – Superangel

+5

duymak harika Thats :) Ben de burada çok şey öğrenirler. Gerçekten çok farklı konular ve fikirler maruz gibi bu site gibi – wired00

+0

sen .. Ben sadece söz istedim bu bir nihayet –

0

Bu tabloların kullanımı neye bağlıdır, ancak ekleme ve güncelleştirme işlemlerinde orijinal tabloya tetikleme yapmayı düşünebilirsiniz. Ekleme veya güncelleme yapılırken, ikinci tabloyu orijinal tablodan yalnızca bir öğeye göre güncelleyin. Daha hızlı olacak. bunu ve gerçekten onun sizindir tam olarak ne yaptığını gerektiğini

+0

Teşekkürler firegnom; Daha önce hiç tetikleyici kullanmamıştım, ama onları okuyacağından emin olacağım. – Superangel

İlgili konular