Mysql - переименовать все таблицы и столбцы в нижний регистр? - PullRequest
10 голосов
/ 24 февраля 2011

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

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

Ответы [ 5 ]

12 голосов
/ 24 февраля 2011

Вы можете попытаться сделать то же самое с таблицей Information_Schema.Columns

EDIT: Что-то вроде

SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CHANGE `', COLUMN_NAME, '` `',
LOWER(COLUMN_NAME), '` ', COLUMN_TYPE, ';')
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{your schema name}'
8 голосов
/ 13 апреля 2012

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

 select concat('rename table ', table_name, ' to ' , lower(table_name) , ';') from information_schema.tables where table_schema = 'your_schema_name';
2 голосов
/ 24 февраля 2011

Возможно, используются встроенные функции 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);
1 голос
/ 13 августа 2017

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

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'
1 голос
/ 12 декабря 2016

Вышеуказанные решения не были достаточно полными для меня. Они удалили атрибуты столбца, такие как auto_increment, значения по умолчанию и Not 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, но результаты поиска и прошлые результаты также работают, если вам нужно.

...