MySQL의 GENERATED COLUMN(생성 컬럼)은 CREATE TABLE 또는 ALTER TABLE 문에서 사용할 수 있는 기능으로, SQL의 INSERT나 UPDATE 절을 통해 값을 직접 입력하지 않고도 데이터를 저장할 수 있게 해주는 강력한 도구입니다. 이 기능은 MySQL 5.7 버전부터 도입되었으며, 생성 컬럼은 해당 테이블 내부의 다른 컬럼 값을 기반으로 동작합니다.
GENERATED COLUMN 문법
column_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE [KEY]]
문법을 단계별로 살펴보면 다음과 같습니다.
- 컬럼 이름과 데이터 타입 지정: 먼저 생성할 컬럼의 이름과 데이터 타입을 명시합니다.
- GENERATED ALWAYS 절 추가: 해당 컬럼이 생성 컬럼임을 나타내기 위해
GENERATED ALWAYS절을 붙입니다. - VIRTUAL 또는 STORED 선택: 생성 컬럼의 유형을 지정합니다. 별도로 지정하지 않으면 MySQL은 기본적으로 VIRTUAL 타입을 사용합니다.
그다음 AS 키워드 뒤의 괄호 안에 표현식(expression)을 작성합니다. 이 표현식에는 리터럴 값, 매개변수가 없는 내장 함수, 연산자, 그리고 같은 테이블 내 다른 컬럼에 대한 참조를 포함할 수 있습니다. 단, 함수를 사용하는 경우 반드시 스칼라(scalar) 함수이면서 결정론적(deterministic)이어야 합니다.
마지막으로, 생성 컬럼이 STORED 타입인 경우에는 해당 컬럼에 UNIQUE 제약 조건을 정의할 수 있습니다.
GENERATED COLUMN 실습 예제
아래 예제에서는 직원 정보를 담는 employee_data 테이블을 생성하면서, 이름(first_name)과 성(last_name)을 자동으로 합쳐주는 생성 컬럼 FULL_NAME을 함께 정의해 보겠습니다.
mysql> Create table employee_data(ID INT AUTO_INCREMENT PRIMARY KEY,
-> First_name VARCHAR(50) NOT NULL,
-> Last_name VARCHAR(50) NOT NULL,
-> FULL_NAME VARCHAR(90) GENERATED ALWAYS AS(CONCAT(First_name,' ',Last_name)));
Query OK, 0 rows affected (0.55 sec)테이블 구조를 확인해 보면 FULL_NAME 컬럼의 Extra 항목에 VIRTUAL GENERATED로 표시되어 있는 것을 확인할 수 있습니다.
mysql> DESCRIBE employee_data; +------------+-------------+------+-----+---------+-------------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | First_name | varchar(50) | NO | | NULL | | | Last_name | varchar(50) | NO | | NULL | | | FULL_NAME | varchar(90) | YES | | NULL | VIRTUAL GENERATED | +------------+-------------+------+-----+---------+-------------------+ 4 rows in set (0.00 sec)
이제 직원 데이터를 삽입해 보겠습니다. 주목할 점은 INSERT 문에서 first_name과 last_name만 입력했다는 것입니다. FULL_NAME 값은 MySQL이 자동으로 계산하여 채워줍니다.
mysql> INSERT INTO employee_data(first_name, Last_name) values('Yashpal','Sharma');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO employee_data(first_name, Last_name) values('Krishan','Kumar');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO employee_data(first_name, Last_name) values('Rakesh','Arora');
Query OK, 1 row affected (0.08 sec)전체 데이터를 조회하면 생성 컬럼이 자동으로 계산된 결과를 확인할 수 있습니다.
mysql> Select * from employee_data; +----+------------+-----------+----------------+ | ID | First_name | Last_name | FULL_NAME | +----+------------+-----------+----------------+ | 1 | Yashpal | Sharma | Yashpal Sharma | | 2 | Krishan | Kumar | Krishan Kumar | | 3 | Rakesh | Arora | Rakesh Arora | +----+------------+-----------+----------------+ 3 rows in set (0.00 sec)
VIRTUAL과 STORED의 차이점
생성 컬럼은 두 가지 유형으로 나뉩니다.
- VIRTUAL (기본값): 행을 읽을 때마다 표현식이 실시간으로 계산됩니다. 디스크 공간을 차지하지 않아 저장 효율이 좋습니다.
- STORED: 데이터가 삽입되거나 수정될 때 계산된 값이 물리적으로 저장됩니다. 조회 시 계산 비용이 없어 읽기 성능이 향상되며, 인덱스와 UNIQUE 제약 조건을 적용할 수 있습니다.
이처럼 GENERATED COLUMN을 활용하면 애플리케이션 코드에서 중복 로직을 줄이고, 데이터 일관성을 보장하면서 파생 데이터를 손쉽게 관리할 수 있습니다.