이 기능을 사용하려면 drizzle-orm@0.32.0 이상과 drizzle-kit@0.23.0 이상 버전이 필요합니다.
SQL에서 생성된 컬럼은 동일한 테이블 내의 다른 컬럼을 기반으로 자동으로 계산된 값을 가지는 컬럼을 생성할 수 있는 기능입니다. 이를 통해 데이터 일관성을 보장하고, 데이터베이스 설계를 단순화하며, 쿼리 성능을 향상시킬 수 있습니다.
생성된 컬럼에는 두 가지 유형이 있습니다:
가상(Virtual) 생성된 컬럼: 쿼리할 때마다 동적으로 계산됩니다. 데이터베이스 저장 공간을 차지하지 않습니다.
저장(Stored) 생성된 컬럼: 행이 삽입되거나 업데이트될 때 계산되며, 그 값은 데이터베이스에 저장됩니다. 이로 인해 인덱싱이 가능하며, 쿼리 성능이 향상됩니다.
생성된 컬럼은 다음과 같은 경우에 특히 유용합니다:
기존 컬럼에서 새로운 데이터를 도출할 때
수동 업데이트를 피하기 위해 계산을 자동화할 때
데이터 무결성과 일관성을 강화할 때
복잡한 계산을 데이터베이스 스키마 내에 유지하여 애플리케이션 로직을 단순화할 때
생성된 컬럼의 구현과 사용법은 SQL 데이터베이스마다 크게 다를 수 있습니다. PostgreSQL, MySQL, SQLite는 각각 고유한 기능, 능력, 제한 사항을 가지고 있습니다. 이 섹션에서는 각 데이터베이스 시스템에서 생성된 컬럼을 최적으로 활용하는 방법을 자세히 살펴보겠습니다.
CREATE TABLE IF NOT EXISTS "test" ( "id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "test_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1), "content" text, "content_search" "tsvector" GENERATED ALWAYS AS (to_tsvector('english', "test"."content")) STORED);--> statement-breakpointCREATE INDEX IF NOT EXISTS "idx_content_search" ON "test" USING gin ("content_search");
CREATE TABLE `test` ( `first_name` text, `gen_name` text GENERATED ALWAYS AS (hi, `test`.`first_name`!) VIRTUAL,);
제한 사항
Drizzle Kit의 push 명령에도 다음과 같은 제한 사항이 있습니다:
push를 사용하여 생성된 제약 조건 표현식과 타입을 변경할 수 없습니다. Drizzle-kit은 이 변경을 무시합니다. 이를 작동시키려면 컬럼을 삭제, push, 그리고 새로운 표현식으로 컬럼을 추가해야 합니다. 이는 데이터베이스 측면에서 복잡한 매핑 때문에 이루어졌습니다. 데이터베이스 측에서 스키마 표현식이 수정되고, 인트로스펙션 시 다른 문자열을 얻을 수 있기 때문입니다. 이 표현식이 변경되었는지 또는 데이터베이스에 의해 변경되고 포맷되었는지 확신할 수 없습니다. 생성된 컬럼이므로 push는 주로 로컬 데이터베이스에서 프로토타이핑에 사용되며, 생성된 컬럼을 삭제하고 생성하는 것이 빠를 것입니다. 이 컬럼은 생성된 컬럼이므로 모든 데이터가 복원됩니다.