VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
구문
VIRTUAL과 STORED 비교
계산 비용이 크고 열을 쓰는 것보다 훨씬 자주 읽을 때
STORED를 사용하세요. 저장 공간이 걱정되거나 쓰기가 자주 일어날 때는 VIRTUAL(기본값)을 사용하세요.
표현식
생성 열 표현식은 같은 행의 다른 열을 참조할 수 있습니다. 다른 생성 열을 참조하거나 비결정적 함수를 호출할 수는 없습니다.NOW(), RAND(), UUID(), 서브쿼리, 저장 함수.
JSON에서 필드를 추출하는 것은 흔한 사용 사례입니다:
생성 열 인덱싱
생성 열에 인덱스를 추가할 수 있습니다.VIRTUAL 열의 경우 MySQL은 계산된 값을 인덱스에 구체화합니다.
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 생성 열 모두 가능합니다.
문제 해결
참고
- MySQL의 JSON — 주요 사용 사례: 생성 열로 JSON 필드 인덱싱
- MySQL 인덱스의 동작 방식 — 생성 열의 인덱스는 일반 인덱스처럼 동작
- MySQL 데이터 타입 선택 — 파생 값을 저장하는 것보다 생성 열이 나은 경우
- MySQL의 소프트 삭제 — 소프트 삭제된 행에 대한 고유 제약 해결책