скрипт MYSQL для преобразования имен столбцов в нижний регистр - PullRequest
6 голосов
/ 23 октября 2009

Я ищу один скрипт MYSQL для преобразования ВСЕХ имен столбцов в базе данных в строчные буквы за один раз ...

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

Кто-нибудь получил такой скрипт?

Спасибо

Ответы [ 4 ]

6 голосов
/ 23 октября 2009

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

РЕДАКТИРОВАТЬ ЗАВЕРШЕННОЕ РЕШЕНИЕ, ЗАПРОШЕННОЕ

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 кто-то в будущем ... Кстати, здесь также написаны сценарии, так что вам может понадобиться убрать их из окончательного кода SQL

6 голосов
/ 01 марта 2011

Вы можете переименовать все имена таблиц и столбцов в нижний регистр, применив следующее регулярное выражение к дампу 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
3 голосов
/ 02 ноября 2012

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

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

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

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

2 голосов
/ 23 октября 2009

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

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

Подробности об этой функции можно найти здесь " MYSQL :: Таблица столбцов INFORMATION_SCHEMA "

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

1010 *, например *

ALTER TABLE mytable CHANGE old_name new_name varchar(5);

См. Также « MYSQL :: ALTER TABLE Синтаксис »

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

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
...