Başka bir mysql veritabanında belirli bir değerin tüm örneklerini değiştirmek nasıl?

4 Cevap php

Ben str_replace PHP için ne bir MySQL eşdeğer arıyorum. Ben "portakallar" bütün "elma" yerine bir sorgu çalıştırmak istiyorsanız, başka bir sözcüğün tüm örneklerini değiştirmek istiyorum.

Nedeni:

GÜNCELLEME meyve name = 'elma' name = 'portakal' SET;

"elma, armut, ananas:" Ben çoğu kez gibi virgülle ayrılmış bir tablo arka arkaya birden fazla kelime var çünkü benim durum için işe gitmiyor, olduğunu. Bu durumda ben sadece elma inceliğini kalmak için portakal ve armut ve ananas yerini istiyorum.

Bunu yapmak için herhangi bir yolu var mı?

4 Cevap

Ignacio işaret ettiği gibi, bir veritabanı tasarım sorunu var. Bunun yerine tek bir sütunda yer alan bilgilerin ayrı parçalar da dahil olmak üzere, bu sütun satır başına bir bilgi parçası ile ayrı bir tablo haline gelmelidir. O "meyve" alan "şapka" adı verilen bir tabloda ise Örneğin, bir sütun "hat_id" ile "şapka" için bir tablo olurdu but no information about fruits ve iki sütun ile ikinci bir sütun "hat_fruits" , "hat_id" ve "fruit_name". Sizin örnekte verilen şapka "hat_fruits", her bir meyve için bir üç satır olurdu.

Eğer bu tasarımı (Eğer veritabanı tasarımı kontrolü varsa) uygulamak kez size başlangıçta vardı basit UPDATE komutunu kullanmak için geri gidebilirsiniz. Ayrıca, meyve türüne göre muktedir dizin daha kolay arama, daha az disk alanı kullanımı, meyve adlarını doğrulamak ve veritabanına uygun meyve sayısında herhangi bir keyfi bir sınırı olmayacak

Yani kesinlikle veritabanı yapısını düzeltmek değil eğer, böyle bir şey deneyebilirsiniz, şunları söyledi:

 REPLACE(REPLACE(CONCAT(',', fruits, ','), ', ', ','), ',apples,', ',oranges,')

Bu canavarlık ilk başlar ve virgül ile sona meyve alan dönüştürür, sonra virgülle önce tüm boşlukları kaldırır. Bu size meyve isimleri açıkça virgülle sınırlandırılmış olduğu bir dize vermelidir. Son olarak, o, elma, (sınırlayıcı dikkat edin), portakal, yerini.

Bundan sonra, tabii ki, (o okuyucu için bir alıştırma olarak bırakılmıştır) başlangıç ​​ve bitiş virgül kapalı şerit ve virgülden sonra boşluk geri koymak gerek.

Update: Tamam, ben o kadar arıyorum dayanamadı:

 REPLACE(TRIM(',' FROM REPLACE(REPLACE(CONCAT(',', fruits, ','), ', ', ','), ',apples,', ',oranges,')), ',', ' ,')

Bu test unutmayın ve ben yine bir MySQL uzmanı değilim - MySQL fonksiyonu yuvalama sorunları ya da böyle bir şey varsa ben bilmiyorum.

PS: Don't tell anyone I was the one who showed you this!

Güvenilir değil. Orada REPLACE() , ancak menüye ananas eklemek için karar verene kadar sadece çalışacaktır.

First Normal Form sizin veritabanı koyarak ve ardından UPDATE tek güvenilir çözümdür kullanarak.

Aşağıda 'Meyveler' tablodaki tüm satırlar için 'Ad' sütununda 'portakal' ile 'elma' tüm kayıp yerini alacak.

UPDATE fruits SET Name=REPLACE(Name,'apples','oranges')