2009-10-23 12 views
6

szukam jednym MySQL skrypt do konwertowania wszystkich nazw kolumn w bazie danych na małe litery w jednym zamachem ...skrypt MySQL konwertować nazwy kolumn na małe

I zostały odziedziczone bazy danych MySQL, która ma wiele nazw kolumn o mieszanych nazwach (150 tabel z dziwną konwencją nazewnictwa) i nie chcę ręcznie przechodzić przez każdą tabelę według tabeli, aby to zrobić.

Czy ktoś ma taki skrypt?

Dzięki

Odpowiedz

2

Można rozwiązać to zadanie, budując scenariusz, począwszy od wyjścia z tym stwierdzeniem:

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

Szczegóły na temat tej funkcji można znaleźć tutaj „MYSQL::The INFORMATION_SCHEMA COLUMNS Table

Następnie możesz użyć funkcji ALTER TABLE .. CHANGE, aby zmienić nazwę kolumny

np.

ALTER TABLE mytable CHANGE old_name new_name varchar(5); 

Patrz także „MYSQL::ALTER TABLE Syntax

Inny typ danych mają różne wymagania, więc trzeba związkami:

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

Dzięki, to dało mi wystarczająco blisko .... – Rippo

+0

nie byłem w stanie go przetestować, ale jestem zadowolony, że byłem blisko :) – Adrian

+0

Będziemy się ten błąd „ERROR 1054 (42S22): Nieznany kolumnie«typ danych» w "liście pól" "w mysql 5.7. Użyj "typ_danych", ale nie "typ danych" – user3081809

6

w przypadku ktokolwiek inny chce to poniżej jest przykładem zakończonej zapytania, proszę przetestuj przed użyciem .....

EDYCJA UKOŃCZONA ROZWIĄZANIE W ŻĄDANIU

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 ktoś w przyszłości ... BTW poglądy są także skrypty tu więc może trzeba wziąć je ze swojego ostatecznego kodu SQL

+0

Jeśli masz kompletne rozwiązanie, prawdopodobnie powinieneś dodać je do swojego pytania, aby inni mogli łatwiej je znaleźć. – Adrian

+1

jesteś tam, nie do końca doskonały, ale wystarczająco blisko! – Rippo

+0

Zmniejszona liczba wyborców, zastanawiając się, dlaczego przegłosowano. wszelkie komentarze są mile widziane, dzięki – Rippo

6

Można zmienić wszystkie nazwy tabel i kolumn na małe przez stosując następujące wyrażenie regularne wysypisko SQL (na przykład zrzut generowane przez mysqldump):

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

To działa, ponieważ wszystkie nazwy tabel i kolumn są owinięte przez `` (backticks). Lepiej jest to zrobić tylko na schemacie, niezależnie od danych (pracuj tylko ze strukturami tabeli, a następnie wstawiaj).

Aby to zrobić w vim otworzyć zrzut SQL i wpisz następujące polecenie:

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

Albo zrobić to z poziomu wiersza poleceń za pomocą sed:

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

Jeśli trzeba to zrobić wielokrotnie zapisz wyrażenie w pliku tekstowym i wywołaj go w następujący sposób:

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

Pomogło mi to TAK DUŻE. Dziękuję Ci! – aendrew

+0

Dzięki d3vid do wydania. Jest teraz bardzo przydatny. – lepe

3

Rozwiązanie zaproponowane przez Lepego jest naprawdę jedyną bezpieczną drogą. Metody tworzenia skryptów są zbyt niebezpieczne, łatwe do wyeksportowania lub przetworzenia niewłaściwej definicji danych. Wszystkie powyższe przykłady skryptów pomijają kilka typów danych, więc są niekompletne.

Zrobiłem sqldump, który umieszcza kontrataki wokół nazw tabel i kolumn, a następnie użyłem Notepad ++ do wyszukiwania (`. *`) I Zamień na \ L \ 1. Dzięki temu wszystkie moje nazwy tabel i kolumn były pisane małymi literami.

Następnie wykonałem kopię zapasową bazy danych, usunęliśmy wszystkie tabele, a następnie wykonałem plik .sql w celu odbudowania. Nie martwiłem się o tworzenie struktury oddzielnej od danych, ponieważ nie znalazłem żadnych wystąpień symbolu zwrotnego w żadnym z moich danych.

W moim przypadku potrzebuję moje nazwy kolumn wszystkie małe litery, ponieważ moje środowisko programistyczne automatycznie konwertuje first_name na First Name: jako moja etykieta pola do wprowadzania danych. Jeśli zostawiłbym je jako czapki (które odziedziczyłem), nawrócą się NA PIERWSZĄ NAZWĘ, co nie jest tym, czego chcę, będę musiał zmienić wszystkie moje etykiety terenowe.