2009-10-23 2 views
6

Ищу один MYSQL скрипт, чтобы преобразовать все имена столбцов в базе данных в нижний регистр в один присест ...сценарий MYSQL преобразовать имена столбцов в нижнем регистре

Я унаследовал базу данных MYSQL, который имеет много имен столбцов смешанного случая (150 таблиц со странным соглашением об именах), и я не хочу вручную вручную обрабатывать каждую таблицу за столом.

У кого-нибудь есть такой скрипт?

Благодаря

ответ

2

Вы можете решить эту задачу путем создания сценария, начиная с выхода из этого заявления:

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

Подробнее об этой функции можно найти здесь «MYSQL::The INFORMATION_SCHEMA COLUMNS Table»

Тогда вы можете использовать функцию ALTER TABLE .. CHANGE, чтобы изменить название столбцов

например

ALTER TABLE mytable CHANGE old_name new_name varchar(5); 

Смотрите также «MYSQL::ALTER TABLE Syntax»

Различные тип данных имеют разные требования, так что вам нужно Союзов:

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

Спасибо, это у меня достаточно близко .... – Rippo

+0

я не был в состоянии проверить это, но я рад, что я был близок :) – Adrian

+0

Мы получим эту ошибку «ERROR 1054 (42S22): Неизвестный столбец„Тип данных“ в «списке полей» в mysql 5.7. Используйте 'data_type', но no 'datatype' – user3081809

6

В случае, если кто-то еще хочет, чтобы это ниже пример заполненного запроса, пожалуйста, тест перед использованием .....

ИЗМЕНИТЬ ЗАВЕРШЕННОЕ РЕШЕНИЕ ЗАПРОСИТЬ

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; 

НТН кто-нибудь в будущем ... BTW взгляды также сценарий здесь, так что вам может понадобиться, чтобы вывести их из окончательного кода SQL

+0

Если у вас есть полное решение, вы должны, вероятно, добавить его к своему вопросу, чтобы другим было проще. – Adrian

+1

там вы идете, его не совсем идеально, но достаточно близко! – Rippo

+0

Вниз голосующим, задаваясь вопросом, почему вы проголосовали. любые комментарии приветствуются, спасибо – Rippo

6

Вы можете переименовать все имена таблиц и столбцов в нижнем регистре по применяя следующее регулярное выражение в SQL дамп (например, свалка, порожденная mysqldump):

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

Это работает, потому что все имена таблиц и столбцов обернуты `` (обратные кавычки). Лучше делать это только на схеме, отдельно от данных (работайте только с структурами таблиц, а затем вставляйте их).

Для этого в Vim, откройте SQL дамп и введите следующую команду:

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

Или это из командной строки с помощью sed:

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

Если вам нужно сделать, это несколько раз, сохраните выражение в текстовом файле и вызовите его следующим образом:

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

Это помогло мне ТАК МНОГО. Спасибо! – aendrew

+0

Спасибо d3vid за издание. Сейчас это очень полезно. – lepe

3

Решение, предложенное lepe, действительно является единственным безопасным способом. Сценарий слишком опасен, он легко экспортируется или обрабатывает неправильное определение данных. Все приведенные выше примеры сценариев не содержат нескольких типов данных, поэтому они неполны.

Я сделал sqldump, который помещает обратные ссылки вокруг имен таблиц и столбцов, а затем использовал Notepad ++ для поиска по (`. *`) И заменил с помощью \ L \ 1. Это отобразило все мои имена таблиц и столбцов в нижнем регистре.

Затем я создал резервную копию моей базы данных, уничтожил все таблицы и затем выполнил мой файл .sql для восстановления. Я не беспокоился о том, что я делаю структуру отдельно от данных, так как я не обнаружил появления символа backtick в любой из моих данных.

В моем случае мне нужно, чтобы мои имена столбцов были в нижнем регистре, потому что моя среда разработки автоматически преобразует first_name в First Name: в качестве метки поля для ввода данных. Если бы я оставил их как кепки (которые я унаследовал), они преобразуются в FIRST NAME, что не то, что я хочу, мне придется изменить все мои метки полей.

Смежные вопросы