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

MySQL GENERATED COLUMN(생성 컬럼) 완벽 정리 – 개념부터 테이블 생성 시 활용법까지

MySQL의 GENERATED COLUMN(생성 컬럼)CREATE TABLE 또는 ALTER TABLE 문에서 사용할 수 있는 기능으로, SQL의 INSERTUPDATE 절을 통해 값을 직접 입력하지 않고도 데이터를 저장할 수 있게 해주는 강력한 도구입니다. 이 기능은 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_namelast_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을 활용하면 애플리케이션 코드에서 중복 로직을 줄이고, 데이터 일관성을 보장하면서 파생 데이터를 손쉽게 관리할 수 있습니다.