2009-10-23 10 views
6

Cerco un singolo script MySQL per convertire tutti i nomi delle colonne in un database in minuscolo in un colpo solo ...uno script MYSQL per convertire i nomi delle colonne in minuscolo

Ho ereditato un database MySQL che ha un molti nomi di colonne con maiuscole e minuscole (150 tabelle con una convenzione di denominazione sconosciuta) e non voglio passare manualmente ciascuna tabella per tabella per farlo.

Qualcuno ha una sceneggiatura del genere?

Grazie

risposta

2

È possibile risolvere questo compito con la costruzione di uno script, a cominciare con l'uscita da questa affermazione:

SELECT table_name, column_name, data_type 
FROM information_schema.columns 
WHERE table_schema = 'dbname'; 
ORDER BY table_name 

i dettagli su questa funzione può essere trovato qui "MYSQL::The INFORMATION_SCHEMA COLUMNS Table"

Poi puoi usare la funzione ALTER TABLE .. CHANGE per cambiare il nome delle colonne

es.

ALTER TABLE mytable CHANGE old_name new_name varchar(5); 

Vedere anche "MYSQL::ALTER TABLE Syntax"

diverso tipo di dati hanno esigenze diverse, quindi è necessario i sindacati:

SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||'('||CHAR(character_maximum_length)||');' AS Line 
    FROM information_schema.columns 
    WHERE table_schema = dbname and datatype in ('CHAR', 'VARCHAR') 
    ORDER BY table_name 
    UNION 
SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||'('||CHAR(numeric_precision)||');' AS Line 
    FROM information_schema.columns 
    WHERE table_schema = dbname and datatype in ('INTEGER') 
    ORDER BY table_name 
    UNION 
SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||'('||CHAR(numeric_precision)||','||CHAR(numeric_scale)|');' AS Line 
    FROM information_schema.columns 
    WHERE table_schema = dbname and datatype in ('FLOAT') 
    ORDER BY table_name 
    UNION 
SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||');' AS Line 
    FROM information_schema.columns 
    WHERE table_schema = dbname and datatype in ('DATE') 
    ORDER BY table_name 
+0

Grazie, questo mi ha fatto avvicinare abbastanza .... – Rippo

+0

Non sono riuscito a testarlo ma sono contento di essere vicino :) – Adrian

+0

Avremo questo errore "ERRORE 1054 (42S22): Colonna 'datatype' sconosciuta in 'field list' "in mysql 5.7. Utilizzare 'data_type', ma non 'tipo di dati' – user3081809

6

Nel caso in cui nessun altro vuole questo qui sotto è un esempio della query completata, si prega di prova prima dell'uso .....

MODIFICA SOLUZIONE COMPLETA COME RICHIESTA

SELECT CONCAT(
'ALTER TABLE ', table_name, 
' CHANGE ', column_name, ' ', 
LOWER(column_name), ' ', column_type, ' ', extra, 
CASE WHEN IS_NULLABLE = 'YES' THEN ' NULL' ELSE ' NOT NULL' END, ';') AS line 
FROM information_schema.columns 
WHERE table_schema = '<DBNAME>' 
AND data_type IN ('char', 'varchar','INT', 'TINYINT', 'datetime','text','double','decimal') 
ORDER BY line; 

HTH qualcuno in futuro ... BTW vista sono anche sceneggiato qui quindi potrebbe essere necessario per portarli fuori del codice SQL finale

+0

Se si dispone di una soluzione completa, probabilmente si dovrebbe aggiungere alla tua domanda in modo che altri possano trovare più facile – Adrian

+1

ci si va, la sua non proprio perfetta, ma abbastanza vicino! – Rippo

+0

Per elettori verso il basso, chiedendosi perché giù votato. tutti i commenti sono benvenuti, grazie – Rippo

6

È possibile rinominare tutti i nomi di tabelle e colonne in minuscolo by applicando la seguente espressione regolare per un dump SQL (ad esempio, la discarica generato da mysqldump):

s/`\(\w\+\)`/\L&/g 

Questo funziona perché tutti i nomi di tabelle e colonne sono avvolti da `` (apici inversi). È meglio farlo solo sullo schema, separato dai dati (lavorare solo con le strutture di tabella e quindi fare gli inserti).

di fare questo in Vim, aprire il dump SQL e immettere il seguente comando:

:%s/`\(\w\+\)`/\L&/g 

o farlo dalla riga di comando utilizzando sed:

sed 's/`\(\w\+\)`/\L&/g' input.sql > output.sql 

Se avete bisogno di farlo ripetutamente, memorizzare l'espressione in un file di testo e richiamarlo come segue:

sed -f regex.txt input.sql > output.sql 
+0

Questo mi ha aiutato MOLTO. Grazie! – aendrew

+0

Grazie a d3vid per l'edizione. È molto utile ora. – lepe

3

La soluzione proposta da lepe è davvero l'unica strada sicura da percorrere. I metodi di scripting sono troppo pericolosi, facili da esportare o elaborare la definizione di dati errata. Tutti gli script di esempio sopra lasciano diversi tipi di dati, quindi sono incompleti.

Ho fatto un sqldump che inserisce i backtick attorno ai nomi delle tabelle e delle colonne, quindi ho usato Notepad ++ per cercare su (`. *`) E Sostituisci con \ L \ 1. Ciò ha reso tutti i miei nomi di tabelle e colonne in lettere minuscole.

Poi ho eseguito il backup mio database, spazzato via tutte le tabelle e quindi eseguito il mio file sql per ricostruire. Non mi sono preoccupato di fare una struttura separata dai dati in quanto non ho trovato alcun segno del simbolo dell'anticipo in nessuno dei miei dati.

Nel mio caso, ho bisogno dei miei nomi delle colonne tutto minuscolo perché il mio ambiente di sviluppo first_name converte automaticamente in Nome: come la mia etichetta del campo per l'immissione dei dati. Se li ho lasciati come tappi (che ho ereditato), avrebbero convertire NOME che non quello che voglio è, avrei dovuto modificare tutti i miei etichette dei campi.

Problemi correlati