MySQL에서 현재 연도로 동적 테이블 이름 만들기
MySQL에서는 테이블 이름에 연도(예: 2019)처럼 동적인 값을 사용해야 하는 경우가 있습니다. 이때 PREPARE 문과 CONCAT() 함수를 함께 활용하면 손쉽게 해결할 수 있습니다. 아래에서 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습용 테이블을 하나 생성합니다.
mysql> create table DemoTable1959
(
UserName varchar(20)
);
Query OK, 0 rows affected (0.00 sec)2. 데이터 삽입
INSERT 명령어를 사용하여 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1959 values('Chris');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1959 values('David');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1959 values('Bob');
Query OK, 1 row affected (0.00 sec)SELECT 문으로 저장된 전체 레코드를 확인합니다.
mysql> select * from DemoTable1959;
실행 결과는 다음과 같습니다.
+----------+ | UserName | +----------+ | Chris | | David | | Bob | +----------+ 3 rows in set (0.00 sec)
3. 동적 쿼리 작성 및 실행
이제 핵심 부분입니다. CONCAT()으로 현재 연도를 추출하여 테이블 이름에 넣고, 해당 문자열을 변수에 담은 뒤 PREPARE와 EXECUTE로 실행합니다.
mysql> set @dynamicQuery = CONCAT('create table `', date_format(curdate(),'%Y'), '` as select UserName from DemoTable1959');
Query OK, 0 rows affected (0.00 sec)
mysql> prepare st from @dynamicQuery;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute st;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0여기서 date_format(curdate(), '%Y')가 시스템의 현재 날짜에서 연도만 추출하므로, 실행 시점의 연도가 자동으로 테이블 이름이 됩니다.
4. 결과 확인
동적으로 생성된 테이블(현재 연도가 2019년인 경우)의 데이터를 조회해 보겠습니다.
mysql> select * from `2019`;
실행 결과는 다음과 같습니다.
+----------+ | UserName | +----------+ | Chris | | David | | Bob | +----------+ 3 rows in set (0.00 sec)
정리
MySQL에서는 DDL 문(테이블 생성 등)에 직접 변수나 함수를 사용할 수 없기 때문에, 위와 같이 PREPARE 문을 이용한 동적 SQL 방식이 필요합니다. 백틱(``)으로 테이블 이름을 감싸면 숫자형 이름도 안전하게 처리할 수 있으며, 이 기법은 연도·월별 로그 테이블 관리 등 주기적으로 테이블을 분리해야 하는 상황에서 특히 유용합니다.