2011-02-23 26 views
9

Recientemente transferí una base de datos de un cuadro de Windows a un cuadro de Linux. Las tablas están mezcladas entre nombres de mayúsculas y minúsculas. Necesito una forma de cambiar el nombre de todas las tablas y columnas a minúsculas. ¿Es eso posible?Mysql - ¿Cambiar el nombre de todas las tablas y columnas a minúsculas?

Veo en this SO answer es posible para las tablas, pero no he encontrado nada que se relacione con los nombres de las columnas.

+0

+1, CamelCase Hacer su mundo al revés ... – ajreal

Respuesta

11

Usted puede tratar de hacer exactamente lo mismo con mesa INFORMATION_SCHEMA.COLUMNS

EDIT: Algo así como

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

Parece que no funciona; el comando parece haber tenido éxito, pero un 'describe ** tablename **' muestra las columnas en mayúscula. – aendrew

+0

De acuerdo, tal vez solo necesito reiniciar MySQL. Estoy haciendo esto en un host compartido, por lo que no estoy seguro si ese es o no es el caso. – aendrew

+0

+1 Funcionó para mí. –

7

Se puede utilizar esta secuencia de comandos propuesta por Anders Eriksson en MySQL Website:

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

Entonces, cuando hago esto y ejecuto el resultado posterior, me dice que la tabla ya existe. – dbinott

1

Las soluciones anteriores no fueron suficientemente completos como para mí. Dejaron caer atributos de columna como auto_increment, valores predeterminados y Not Null. Además, no quería cambiar columnas en information_schema y mysql.

Advertencia: No investigué todas las combinaciones de atributos de columna. Solo el conjunto que me permitió convertir mi base de datos. Puede haber más constantes como CURRENT_TIMESTAMP en su base de datos.

He utilizado algunas de las siguientes variaciones para determinar lo que estaba en mi base de datos.

SELECT distinct COLUMN_DEFAULT FROM information_schema.columns 

Esta es la solución que funcionó para mí:

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' 

Ahorro de tiempo: notas Para dar salida a un archivo necesita conectarse a la base de datos con derechos suficientes. Tengo acceso de root, así que inicié sesión como root, pero el corte y el pasado de los resultados también funcionan si es necesario.

+0

Esto funciona bien, pero necesitaba agregar la palabra clave DISTINCT a la selección, de lo contrario recibí registros duplicados. – omarjebari

1

OK He modificado la respuesta de Dave Benson para agregar la palabra clave DISTINCT (para evitar que se devuelvan registros duplicados) y también para verificar si hay columnas de marca de tiempo que aceptan nulos.

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' 
Cuestiones relacionadas