개요
MySQL에서 데이터베이스 내 모든 테이블의 열(컬럼) 이름을 소문자로 변경해야 할 때가 있습니다. 이럴 때 INFORMATION_SCHEMA.COLUMNS를 활용하면 각 테이블을 일일이 수정하지 않고도 ALTER TABLE 문을 한 번에 생성할 수 있습니다.
기본 구문
아래 쿼리는 INFORMATION_SCHEMA.COLUMNS에서 열 정보를 조회한 뒤, CONCAT 함수로 ALTER TABLE 문을 자동으로 만들어 줍니다.
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CHANGE `', COLUMN_NAME, '` `',
LOWER(COLUMN_NAME), '` ', COLUMN_TYPE, ';') AS anyAliasName
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'yourDatabaseName';예제 데이터베이스
실습을 위해 두 개의 테이블을 가진 bothinnodbandmyisam 데이터베이스를 사용합니다. 이 데이터베이스에는 다음과 같은 테이블이 있습니다.
- employee
- student
employee 테이블 구조 확인
mysql> desc employee;
실행 결과는 다음과 같습니다. EmployeeId와 EmployeeName처럼 대문자가 포함된 열 이름이 있는 것을 확인할 수 있습니다.
+--------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+-------+ | EmployeeId | int(11) | YES | | NULL | | | EmployeeName | varchar(30) | YES | | NULL | | +--------------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
student 테이블 구조 확인
mysql> desc student;
마찬가지로 StudentId와 StudentName 열 이름에 대문자가 포함되어 있습니다.
+-------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+-------+ | StudentId | int(11) | YES | | NULL | | | StudentName | varchar(20) | YES | | NULL | | +-------------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
열 이름을 소문자로 변경하는 쿼리 실행
이제 실제 데이터베이스에 위 쿼리를 적용해 보겠습니다.
mysql> SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CHANGE `', COLUMN_NAME, '` `',
-> LOWER(COLUMN_NAME), '` ', COLUMN_TYPE, ';') AS changeColumnNameToLower
-> FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'bothinnodbandmyisam';쿼리를 실행하면 아래와 같이 각 열을 소문자로 변경하는 ALTER TABLE 문이 생성됩니다.
+------------------------------------------------------------------------+ | changeColumnNameToLower | +------------------------------------------------------------------------+ | ALTER TABLE employee CHANGE `EmployeeId` `employeeid` int(11); | | ALTER TABLE employee CHANGE `EmployeeName` `employeename` varchar(30); | | ALTER TABLE student CHANGE `StudentId` `studentid` int(11); | | ALTER TABLE student CHANGE `StudentName` `studentname` varchar(20); | +------------------------------------------------------------------------+ 4 rows in set (0.00 sec)
결론 및 주의 사항
위 결과에서 확인할 수 있듯이, 모든 열 이름이 소문자로 변환된 ALTER TABLE 문이 자동으로 생성되었습니다. 이 출력 결과를 복사하여 그대로 실행하면 해당 데이터베이스의 모든 열 이름이 소문자로 변경됩니다.
다만 몇 가지 유의할 점이 있습니다. 첫째, CHANGE 절은 열 이름뿐 아니라 열 정의도 함께 지정해야 하므로, 인덱스나 기본 키, 외래 키가 걸려 있는 열은 추가 작업이 필요할 수 있습니다. 둘째, 대량의 테이블을 수정하기 전에는 반드시 데이터베이스를 백업한 후 진행하는 것이 안전합니다. 마지막으로, MySQL 서버 설정의 lower_case_table_names 옵션은 테이블 이름에만 영향을 미치며 열 이름에는 적용되지 않으므로, 열 이름의 일관성이 필요하다면 위 방법처럼 직접 변경해야 합니다.