Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 저장 프로시저를 활용해 테이블을 동적으로 생성하는 방법

MySQL에서 테이블 이름을 매개변수로 받아 테이블을 동적으로 생성하려면 저장 프로시저(Stored Procedure)를 활용하는 것이 가장 효과적입니다. 이 글에서는 StudentId(int형)와 StudentName(varchar형) 두 개의 컬럼을 가진 테이블을 동적으로 생성하는 예제를 단계별로 살펴보겠습니다.

1. 저장 프로시저 생성하기

먼저 DELIMITER를 변경한 후, 테이블 이름을 인자로 받는 저장 프로시저를 작성합니다. 프로시저 내부에서는 CONCAT 함수로 CREATE TABLE 문을 동적으로 조합하고, PREPARE와 EXECUTE로 실행합니다.

mysql> DELIMITER $$
mysql> CREATE PROCEDURE creatingDynamicTableDemo(yourTableName VARCHAR(200))
    -> BEGIN
    ->     SET @name = yourTableName;
    ->     SET @st = CONCAT('
    '>         CREATE TABLE IF NOT EXISTS `', @name, '` (
    '>         `StudentId` int UNSIGNED NOT NULL AUTO_INCREMENT,
    '>         `StudentName` varchar(20) NOT NULL,
    '>         PRIMARY KEY (`StudentId`)
    '>     )
    '> ');
    -> PREPARE myStatement FROM @st;
    -> EXECUTE myStatement;
    -> DEALLOCATE PREPARE myStatement;
    -> END $$
Query OK, 0 rows affected (0.16 sec)
mysql> DELIMITER ;

위 코드의 핵심 포인트는 다음과 같습니다.

  • CREATE TABLE IF NOT EXISTS : 같은 이름의 테이블이 이미 존재할 경우 오류 없이 건너뜁니다.
  • AUTO_INCREMENT : StudentId 컬럼에 자동 증가 속성을 부여합니다.
  • PRIMARY KEY : StudentId를 기본 키로 설정하여 레코드의 고유성을 보장합니다.
  • PREPARE / EXECUTE / DEALLOCATE : 동적으로 만든 SQL 문을 준비하고 실행한 뒤 리소스를 해제합니다.

2. 저장 프로시저 호출하기

작성된 프로시저는 CALL 명령어로 호출할 수 있습니다. 여기서는 'DemoTable'이라는 이름으로 테이블을 생성해 보겠습니다.

mysql> call creatingDynamicTableDemo('DemoTable');
Query OK, 0 rows affected, 1 warning (0.65 sec)

3. 생성된 테이블 구조 확인하기

테이블이 정상적으로 생성되었는지 DESC 명령어로 구조를 확인할 수 있습니다.

mysql> desc DemoTable;

출력 결과

+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| StudentId   | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| StudentName | varchar(20)      | NO   |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

출력 결과를 보면 StudentId가 PRI(기본 키)이며 auto_increment 속성이 적용되고, StudentName은 varchar(20) 타입으로 NOT NULL 제약이 걸려 있는 것을 확인할 수 있습니다. 이처럼 저장 프로시저와 동적 SQL을 조합하면 런타임에 유연하게 테이블 구조를 생성할 수 있습니다.