MySQL에서는 하나의 테이블에 여러 개의 가상 생성 컬럼(virtual generated column)을 동시에 정의할 수 있습니다. CREATE TABLE 문을 작성할 때 각 컬럼마다 별도의 표현식을 지정해 주기만 하면 되며, 이는 아래 예제를 통해 쉽게 확인할 수 있습니다.
예제
다음 예제에서는 profit이라는 테이블을 생성하면서 두 개의 가상 생성 컬럼을 함께 정의합니다. 첫 번째 컬럼인 profit은 price에서 cost를 뺀 값을 계산하고, 두 번째 컬럼인 price_revised는 price에서 2를 뺀 값을 계산합니다.
mysql> Create table profit(cost int, price int, profit int AS (price-cost), price_revised int AS (price-2)); Query OK, 0 rows affected (0.73 sec)
DESCRIBE 문으로 테이블 구조를 확인해 보면, 두 컬럼 모두 Extra 항목에 'VIRTUAL GENERATED'로 표시되어 있는 것을 알 수 있습니다.
mysql> Describe profit; +---------------+---------+------+-----+---------+-------------------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------+------+-----+---------+-------------------+ | cost | int(11) | YES | | NULL | | | price | int(11) | YES | | NULL | | | profit | int(11) | YES | | NULL | VIRTUAL GENERATED | | price_revised | int(11) | YES | | NULL | VIRTUAL GENERATED | +---------------+---------+------+-----+---------+-------------------+ 4 rows in set (0.00 sec)
이제 일반적인 INSERT 문을 사용해 cost와 price 값만 입력합니다. 생성 컬럼에는 직접 값을 넣을 수 없으며, 나머지 두 컬럼의 값은 자동으로 계산됩니다.
mysql> Insert into profit(Cost, Price) values(100,110); Query OK, 1 row affected (0.04 sec) mysql> Insert into profit(Cost, Price) values(200,220); Query OK, 1 row affected (0.04 sec)
SELECT 문으로 데이터를 조회하면, 입력하지 않은 profit과 price_revised 값이 표현식에 따라 자동으로 계산되어 출력되는 것을 확인할 수 있습니다.
mysql> Select * from profit; +------+-------+--------+---------------+ | cost | price | profit | price_revised | +------+-------+--------+---------------+ | 100 | 110 | 10 | 108 | | 200 | 220 | 20 | 218 | +------+-------+--------+---------------+ 2 rows in set (0.00 sec)
가상 생성 컬럼의 특징
가상 생성 컬럼은 물리적으로 디스크에 저장되지 않고, 행을 읽을 때마다 정의된 표현식을 기준으로 실시간으로 계산됩니다. 따라서 저장 공간을 절약할 수 있지만, 조회 시점에 연산이 수행되므로 복잡한 표현식의 경우 성능에 영향을 줄 수 있습니다. 반면 STORED GENERATED 컬럼은 값을 물리적으로 저장하기 때문에 읽기 속도는 빠르지만 디스크 공간을 추가로 사용하게 됩니다.