메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
생성 열은 애플리케이션이 값을 저장하는 대신 표현식에서 값이 파생되는 열입니다. MySQL이 자동으로 계산합니다 — 스키마에 공식을 한 번 정의하면 MySQL이 일관성을 유지합니다.

구문

VIRTUAL과 STORED 비교

계산 비용이 크고 열을 쓰는 것보다 훨씬 자주 읽을 때 STORED를 사용하세요. 저장 공간이 걱정되거나 쓰기가 자주 일어날 때는 VIRTUAL(기본값)을 사용하세요.

표현식

생성 열 표현식은 같은 행의 다른 열을 참조할 수 있습니다. 다른 생성 열을 참조하거나 비결정적 함수를 호출할 수는 없습니다.
생성 열에 허용되는 함수는 결정적이어야 합니다 — 같은 입력은 항상 같은 출력을 생성해야 합니다. 허용되지 않는 것: NOW(), RAND(), UUID(), 서브쿼리, 저장 함수. JSON에서 필드를 추출하는 것은 흔한 사용 사례입니다:

생성 열 인덱싱

생성 열에 인덱스를 추가할 수 있습니다. VIRTUAL 열의 경우 MySQL은 계산된 값을 인덱스에 구체화합니다.
이것은 함수형 인덱스 — 원시 열 값이 아니라 열에 대한 함수에 거는 인덱스 — 를 만드는 방법이기도 합니다. MySQL 8.0.13 이상은 함수형 인덱스를 직접 지원하며(INDEX (LOWER(email))), 내부적으로 숨겨진 생성 열을 만듭니다:

삽입과 갱신

INSERT나 UPDATE에서 생성 열에 값을 할당할 수 없습니다. 열 값은 항상 표현식에서 파생됩니다. DEFAULT를 명시적으로 쓸 수는 있지만, 그것이 전부입니다:

ALTER TABLE

기존 테이블에 생성 열 추가하기:
생성 열의 표현식 변경하기. VIRTUAL/STORED 저장 클래스는 그대로 유지되어야 합니다 — 전환하면 ERROR 3106: 'Changing the STORED status' is not supported for generated columns가 발생하므로, 저장 방식을 바꾸려면 열을 삭제하고 다시 추가해야 합니다:

자주 묻는 질문

WHERE 절에서 생성 열을 사용할 수 있나요?

예. 인덱스가 없는 VIRTUAL 열의 경우 MySQL은 스캔 중에 표현식을 계산합니다. STORED 열이나 인덱스가 있는 VIRTUAL 열의 경우 값은 이미 구체화되어 있습니다. 인덱스가 사용되는지 확인하려면 EXPLAIN을 사용하세요.

원본 열이 바뀌면 생성 열이 자동으로 갱신되나요?

예. MySQL은 VIRTUAL 생성 열을 읽을 때마다 다시 계산합니다. STORED 생성 열은 표현식의 열에 영향을 주는 모든 INSERT나 UPDATE에서 다시 계산되어 기록됩니다.

생성 열을 파티션 키로 사용할 수 있나요?

예. STORED와 VIRTUAL 생성 열 모두 가능합니다.

문제 해결

참고