Mysql-переименовать все таблицы и столбцы в нижний регистр?

недавно я перенес базу данных из окна windows в окно linux. Таблицы смешаны между именами в нижнем и верхнем регистре. Мне нужен способ переименовать все таблицы и столбцы в нижний регистр. Это возможно?

Я вижу это так ответ это возможно для таблиц, но не нашел ничего, что касается имен столбцов.

5 ответов


вы можете попробовать сделать то же самое с Information_Schema.Столбцы таблицы

изменить: Что-то вроде

SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CHANGE `', COLUMN_NAME, '` `',
LOWER(COLUMN_NAME), '` ', COLUMN_TYPE, ';')
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{your schema name}'

вы можете использовать этот скрипт, предложенный Андерсом Эрикссоном на Веб-Сайт MySQL:

 select concat('rename table ', table_name, ' to ' , lower(table_name) , ';') from information_schema.tables where table_schema = 'your_schema_name';

возможно, используются встроенные функции LOWER () UPPER (). http://www.sqlinfo.net/mysql/mysql_function_upper_lower.php

alter table [table name] change [old column name] [new column name] varchar (50);

вышеуказанные решения были недостаточно полными для меня. Они отбросили атрибуты столбцов, такие как auto_increment, значения по умолчанию, а не Null. Кроме того, я не хотел менять столбцы в information_schema и mysql.

предупреждение: я не исследовал все комбинации атрибутов столбцов. Только набор, который позволил мне преобразовать мою базу данных. В вашей базе данных может быть больше констант, таких как CURRENT_TIMESTAMP.

я использовал несколько вариантов ниже, чтобы определить что было в моей базе данных.

SELECT distinct COLUMN_DEFAULT FROM information_schema.columns

это решение, которое сработало для меня:

select 
CONCAT('ALTER TABLE ', '`', t.TABLE_NAME, '`', ' CHANGE `', c.COLUMN_NAME, '`',
    ' `', LOWER(`COLUMN_NAME`), '` ', COLUMN_TYPE,
IF (IS_NULLABLE = "YES", ' ', ' NOT NULL'), 
IF (IS_NULLABLE = "YES",
    IF (COLUMN_DEFAULT IS NULL, 'DEFAULT NULL', IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, ''''))),
    IF (COLUMN_DEFAULT IS NOT NULL, IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, '''') ), '') ) ,
' ', EXTRA, ';')
from 
information_schema.tables t
JOIN 
information_schema.columns c
ON (c.table_name = t.table_name)
WHERE t.table_type = 'BASE TABLE'
AND t.table_schema not in ('information_schema', 'mysql')
INTO OUT FILE '/tmp/ColumnsToLowerCase.sql'

экономия времени ноты: Для вывода в файл необходимо войти в базу данных с достаточными правами. У меня есть root-доступ, поэтому я вошел в систему как root, но cut и прошлое результатов тоже работает, если вам нужно.


OK Я изменил ответ Дэйва Бенсона, чтобы добавить ключевое слово DISTINCT (чтобы предотвратить возврат повторяющихся записей), а также проверить столбцы метки времени nullable.

SELECT DISTINCT
    CONCAT('ALTER TABLE ', '`', t.TABLE_NAME, '`', ' CHANGE `', c.COLUMN_NAME, '`', ' `', LOWER(`COLUMN_NAME`), '` ', COLUMN_TYPE,
IF (IS_NULLABLE = "YES", ' ', ' NOT NULL'), IF (IS_NULLABLE = "YES", IF (COLUMN_DEFAULT IS NULL, IF (COLUMN_TYPE = 'TIMESTAMP', 'NULL DEFAULT NULL', 'DEFAULT NULL'), IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, ''''))), IF (COLUMN_DEFAULT IS NOT NULL,IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, '''')),'')), ' ', EXTRA, ';')
FROM information_schema.tables t
JOIN information_schema.columns c ON (c.table_name = t.table_name)
WHERE t.table_type = 'BASE TABLE'
AND c.table_schema not in ('information_schema', 'mysql')
INTO OUT FILE '/tmp/ColumnsToLowerCase.sql'