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'