2011-02-23 2 views
9

나는 최근 윈도우 박스에서 리눅스 박스로 데이터베이스를 전송했다. 테이블은 대문자와 소문자 사이에 섞여 있습니다. 나는 모든 테이블과 컬럼의 이름을 소문자로 바꾸는 방법이 필요하다. 그게 가능하니?Mysql - 모든 테이블과 열의 이름을 소문자로 바꿉니 까?

나는 this SO answer에서 테이블을 볼 수 있지만 열 이름을 다루는 항목을 찾지 못했습니다.

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

+1, 너의 세계를 거꾸로 만들어라. – ajreal

답변

11

당신은

편집 INFORMATION_SCHEMA.COLUMNS 테이블과 똑같은 일을 시도 할 수 있습니다. http://www.sqlinfo.net/mysql/mysql_function_upper_lower.php

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

작동하지 않는다. 명령이 성공한 것처럼 보이지만'describe ** tablename ** '은 대문자로 표시된 열을 표시합니다. – aendrew

+0

, MySQL을 다시 시작하면됩니다. 공유 호스트에서이 작업을 수행하고 있기 때문에 그렇지 않은지 확실하지 않습니다. – aendrew

+0

+1 나를 위해 일했습니다. –

1

어쩌면 내장 사용하는 기능 LOWER 같은 뭔가() UPPER() :

7

당신은 MySQL Website에 앤더스 에릭슨에 의해 제안 된이 스크립트를 사용할 수

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

그래서이 작업을 수행하고 후속 결과를 실행하면 표가 이미 있음을 알 수 있습니다. – dbinott

1

위의 솔루션은 나를 위해 충분히 완료되지 않았다. auto_increment, 기본값 및 Null과 같은 열 속성을 삭제했습니다. 또한, 나는 information_schema와 mysql에서 컬럼을 변경하고 싶지 않았다.

경고 : 모든 열 속성 조합을 조사하지 않았습니다. 내 데이터베이스를 변환 할 수있게 해주는 세트. 데이터베이스에 CURRENT_TIMESTAMP와 같은 상수가 더있을 수 있습니다.

내 데이터베이스에 무엇이 있는지 확인하기 위해 아래의 몇 가지 변형을 사용했습니다.

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' 

시간 절약 노트 : 충분한 권한으로 데이터베이스에 로그인 할 수있는 파일로 출력하려면

SELECT distinct COLUMN_DEFAULT FROM information_schema.columns 

은 나를 위해 일한 솔루션입니다. 루트 권한으로 로그인 했으므로 루트로 로그인했지만 결과를 잘라내어 지나치는 경우에도 작동합니다.

+0

잘 작동하지만 DISTINCT 키워드를 선택해야합니다. 그렇지 않으면 중복 레코드가 반환됩니다. – omarjebari

1

OK DISTINCT 키워드를 추가하여 (중복 레코드가 반환되지 않도록) 또한 nullable timestamp 열을 확인하기 위해 Dave Benson의 대답을 수정했습니다.

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'