2013-01-09 10 views
5

Ho un'installazione Moodle che ho migrato su un altro server e ho bisogno di cambiare diversi riferimenti al vecchio dominio.Come posso sostituire una stringa in un database MySQL per tutte le tabelle in tutti i campi in tutte le righe?

Come è possibile sostituire una stringa per un'altra stringa in MySQL per un determinato database durante la ricerca di tutte le tabelle, tutti i campi e tutte le righe?

Non è necessario modificare i nomi dei campi, solo i valori.


correlati: How can I use mySQL replace() to replace strings in multiple records?

Ma l'contrassegnato come soluzione di risposta implica digito con forza il nome della tabella e ho bisogno di sparare questo in un intero database, non funziona manualmente su ogni tavolo l'esecuzione dello script N volte.

+0

Piuttosto si crea una nuova tabella quindi ... rilascia quella vecchia .. come si dice tutte le tabelle in tutti i campi in tutte le righe ... questo è letteralmente un database di entier vero? – bonCodigo

+0

Proverei a scrivere una query che genera lo script che farebbe una query per una tabella ... – ppeterka

+0

@ppeterka: Meta, mi piace. Ma spero che MySQL abbia qualcosa di costruito. Chi lo sa in questi giorni, con Postgres che ha campi array e così via! – sergserg

risposta

2

Prendere in considerazione l'interrogazione di INFORMATION_SCHEMA.COLUMNS e la ricerca dinamica di colonne e tabelle. Provare qualcosa di simile creando un cursore di tutte le colonne e le tabelle nel db:

DECLARE col_names CURSOR FOR 
SELECT column_name, table_name 
FROM INFORMATION_SCHEMA.COLUMNS 

Poi iterare attraverso ciascuna delle colonne in ciascuna delle tabelle ed eseguire SQL dinamica/preparati ad aggiornare cui esiste la stringa.

Qui ci sono un paio di buoni posti per arrivare nella giusta direzione:

https://stackoverflow.com/a/4951354/1073631

https://stackoverflow.com/a/5728155/1073631

7

Questo può sembrare un po '... brutto. Ma forse semplicemente scaricare il database in un file sql/txt, sostituire tutte le stringhe e ricreare il database usando il dump modificato.

+0

Ho come ultima possibilità, fare un mysqldump e l'importazione richiederà diverse ore in quanto il database è grande circa 170 GB. – sergserg

+0

Sapete quale comando su Linux dovrei cercare per sostituire il testo all'interno di un file .sql direttamente dal terminale? – sergserg

+0

Cosa ti fa pensare che farlo usando le funzioni integrate sarà più veloce? La ricerca a testo integrale è ciò che è lo strumento utilizzato. Immagino che usare linux sed sul file di testo sia più veloce di qualsiasi strumento integrato. // edit: hai postato dopo che ho scritto - 'sed' è quello che stai cercando – Dariusz

2

è possibile eseguire il seguente codice per creare tutte le dichiarazioni udpate si avrebbe bisogno di correre per fare i tuoi aggiornamenti. Aggiornerebbe ogni campo in ogni tabella all'interno del tuo database. Dovresti eseguire questo codice, copiare i risultati ed eseguirli.

AVVERTENZA - Assicurarsi di eseguire il test in un ambiente di prova. Non vuoi spiacevoli sorprese. Modifica secondo necessità.

SELECT concat('UPDATE ', TABLE_NAME, ' SET ', COLUMN_NAME, ' = REPLACE(', COLUMN_NAME, ', ''STRING_TO_REPLACE'', ''REPLACE_STRING'')') 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE TABLE_SCHEMA = 'YOUR_DATABASE_NAME' 
     AND DATA_TYPE IN ('char', 'varchar') 
; 

Ho limitato questo solo ai campi char e varchar. Potrebbe essere necessario aggiungere ulteriori tipi di dati.

+0

Appena aggiornato, mi mancava una parentesi chiusa. – Tom

Problemi correlati