webForumDet fria alternativet
Logga in / Bli medlem

Temptabell!?

Databaser & SQL

5 svar · 452 visningar · startad av Peeer

Medlem sedan mars 20025 907 inlägg
Trådstart#1

Hej!
Har en tabell ("info") som innehåller en herrans massa poster. En del av dessa poster (dock långtifrån alla) innehåller data som jag vill ersätta med annan data. Detta löser jag för nuvarande på följande sätt:

UPDATE info SET infokolumn = REPLACE(infokolumn, 'prefix_INFO', 'prefix2_NYINFO') WHERE infokolumn LIKE '%prefix_INFO%';
UPDATE info SET infokolumn = REPLACE(infokolumn, 'prefix_INFO2', 'prefix2_NYINFO2') WHERE infokolumn LIKE '%prefix_INFO2%';
UPDATE info SET infokolumn = REPLACE(infokolumn, 'prefix_INFO3', 'prefix2_NYINFO3') WHERE infokolumn LIKE '%prefix_INFO3%';

osv..

Detta fullständigt suger musten ur maskinen (konstigt:OO ) så jag letar nu efter alternativa vägar. Min tanke var att jag skulle minska ner mängden data som måste sökas igenom varje gång, genom att först skapa en temporär tabell som innehåller alla poster som innehåller "prefix_". Denna temporära tabell skulle jag sedan söka igenom på samma sätt som ovan (med replace) för att sedan slå ihop "info" med temptabellen igen. Detta borde väl ge en rätt stor prestandavinst?

Frågan är nu hur jag gör detta?

  1. Kopiera all data som innehåller "%prefix_%" till "tabell2".
  2. Slå ihop "tabell2" och "info" igen och se till så att alla rader i "info" som har samma ID som motsvarande rad i "tabell2" skrivs över.

DBMS: MySQL 4.0

Medlem sedan dec. 200012 464 inlägg
#2
UPDATE info 
SET infokolumn = 
case 
when infokolumn  like '%prefix_INFO3%'
then REPLACE(infokolumn, 'prefix_INFO3',prefix2_NYINFO') 
when infokolumn  like '%prefix_INFO2%'
then REPLACE(infokolumn, 'prefix_INFO2',prefix2_NYINFO') 
when infokolumn  '%prefix_INFO%'
then REPLACE(infokolumn, 'prefix_INFO',prefix2_NYINFO') 
end
WHERE infokolumn LIKE '%prefix_INFO%';
Medlem sedan mars 20025 907 inlägg
#3

Hmm, intressant lösning. Fungerar förhoppningsvis bättre än min nuvarande. :)

Medlem sedan mars 20025 907 inlägg
#4

Ja snabbare går det utan tvekan, dock så strular det lite om man har flera satser som ska ersättas i samma post. Den ersätter bara en av dem. Visst går det att köra sql-satsen flera gånger (tills man ser att "affected rows" == 0), men går det att ändra i sql-satsen istället så vore ju det bättre. :)

Medlem sedan dec. 200012 464 inlägg
#5

Använd flera replace i så fall

replace(
REPLACE(infokolumn, 'prefix_INFO3',prefix2_NYINFO') ,
'anna själv','tredje')

tänk även på ordningen mellan olika when

Medlem sedan mars 20025 907 inlägg
#6

Ja så kan man ju göra :) Tackar!

271 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)