CREATE INDEX
CREATE INDEX
이 페이지는 SQLite에서 CREATE INDEX 문을 사용하여 데이터베이스 테이블에 새 인덱스를 생성하는 방법을 설명합니다. 인덱스는 쿼리 성능을 향상시키기 위해 하나 이상의 열에 대해 만들 수 있으며, 고유 인덱스나 부분 인덱스와 같은 다양한 옵션도 다룹니다.
출처: 문서
본문
1. 구문
create-index-stmt:
CREATE UNIQUE INDEX IF NOT EXISTS schema-name . index-name ON table-name ( indexed-column ) , WHERE expr
expr:
literal-value bind-parameter schema-name . table-name . column-name unary-operator expr expr binary-operator expr function-name ( function-arguments ) filter-clause over-clause ( expr ) , CAST ( expr AS type-name ) expr COLLATE collation-name expr NOT LIKE GLOB REGEXP MATCH expr expr ESCAPE expr expr ISNULL NOTNULL NOT NULL expr IS NOT DISTINCT FROM expr expr NOT BETWEEN expr AND expr expr NOT IN ( select-stmt ) expr , schema-name . table-function ( expr ) table-name , NOT EXISTS ( select-stmt ) CASE expr WHEN expr THEN expr ELSE expr END raise-function
filter-clause:
FILTER ( WHERE expr )
function-arguments:
DISTINCT expr , * ORDER BY ordering-term ,
ordering-term:
expr COLLATE collation-name DESC ASC NULLS FIRST NULLS LAST
literal-value:
CURRENT_TIMESTAMP numeric-literal string-literal blob-literal NULL TRUE FALSE CURRENT_TIME CURRENT_DATE
over-clause:
OVER window-name ( base-window-name PARTITION BY expr , ORDER BY ordering-term , frame-spec )
frame-spec:
GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING RANGE ROWS UNBOUNDED PRECEDING expr PRECEDING CURRENT ROW expr PRECEDING CURRENT ROW expr FOLLOWING expr PRECEDING CURRENT ROW expr FOLLOWING EXCLUDE CURRENT ROW EXCLUDE GROUP EXCLUDE TIES EXCLUDE NO OTHERS
ordering-term:
expr COLLATE collation-name DESC ASC NULLS FIRST NULLS LAST
raise-function:
RAISE ( ROLLBACK , expr ) IGNORE ABORT FAIL
select-stmt:
WITH RECURSIVE common-table-expression , SELECT DISTINCT result-column , ALL FROM table-or-subquery join-clause , WHERE expr GROUP BY expr HAVING expr , WINDOW window-name AS window-defn , VALUES ( expr ) , , compound-operator select-core ORDER BY LIMIT expr ordering-term , OFFSET expr , expr
common-table-expression:
table-name ( column-name ) AS NOT MATERIALIZED ( select-stmt ) ,
compound-operator:
UNION UNION INTERSECT EXCEPT ALL
join-clause:
table-or-subquery join-operator table-or-subquery join-constraint
join-constraint:
USING ( column-name ) , ON expr
join-operator:
NATURAL LEFT OUTER JOIN , RIGHT FULL INNER CROSS
ordering-term:
expr COLLATE collation-name DESC ASC NULLS FIRST NULLS LAST
result-column:
expr AS column-alias * table-name . *
table-or-subquery:
schema-name . table-name AS table-alias INDEXED BY index-name NOT INDEXED table-function-name ( expr ) , AS table-alias ( select-stmt ) ( table-or-subquery ) , join-clause
window-defn:
( base-window-name PARTITION BY expr , ORDER BY ordering-term , frame-spec )
frame-spec:
GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING RANGE ROWS UNBOUNDED PRECEDING expr PRECEDING CURRENT ROW expr PRECEDING CURRENT ROW expr FOLLOWING expr PRECEDING CURRENT ROW expr FOLLOWING EXCLUDE CURRENT ROW EXCLUDE GROUP EXCLUDE TIES EXCLUDE NO OTHERS
type-name:
name ( signed-number , signed-number ) ( signed-number )
signed-number:
+ numeric-literal -
indexed-column:
column-name COLLATE collation-name DESC expr ASC
CREATE INDEX 명령은 CREATE INDEX 키워드, 새 인덱스의 이름, ON 키워드, 인덱싱할 기존 테이블의 이름, 그리고 인덱스 키로 사용할 테이블 열 이름 및/또는 식의 괄호로 묶인 목록으로 이루어져요. 선택적 WHERE 절이 포함되면 해당 인덱스는 "부분 인덱스(partial index)"가 돼요.
선택적 IF NOT EXISTS 절이 있고 동일한 이름의 다른 인덱스가 이미 존재한다면, 이 명령은 아무 작업도 수행하지 않아요.
단일 테이블에 연결할 수 있는 인덱스 수에는 임의의 제한이 없어요. 인덱스의 열 수는 sqlite3_limit(SQLITE_LIMIT_COLUMN,...)으로 설정된 값으로 제한돼요.
인덱스는 DROP INDEX 명령으로 제거돼요.
1.1. 고유 인덱스
CREATE와 INDEX 사이에 UNIQUE 키워드가 있으면 중복 인덱스 항목이 허용되지 않아요. 중복 항목을 삽입하려는 모든 시도는 오류를 발생시켜요.
고유 인덱스의 목적상 모든 NULL 값은 다른 모든 NULL 값과 서로 다른 것으로 간주되므로 고유해요. 이는 SQL-92 표준의 두 가지 가능한 해석 중 하나예요(표준의 문구가 모호해요). SQLite가 사용하는 해석도 동일하며, PostgreSQL, MySQL, Firebird, Oracle도 같은 해석을 따라요. Informix와 Microsoft SQL Server는 표준의 다른 해석을 따르는데, 모든 NULL 값이 서로 동등하다는 해석이에요.
1.2. 식 기반 인덱스
인덱스의 식은 다른 테이블을 참조할 수 없고, 하위 쿼리나 결과가 변경될 수 있는 함수(예: random() 또는 sqlite_version())를 사용할 수 없어요. 인덱스의 식은 인덱싱되는 테이블의 열만 참조할 수 있어요. 식 기반 인덱스는 3.9.0(2015-10-14) 이전 버전의 SQLite에서는 작동하지 않아요. CREATE INDEX 문에서 일반 식을 사용하는 방법에 대한 자세한 내용은 Indexes On Expressions 문서를 참조하세요.
1.3. 내림차순 인덱스
각 열 이름이나 식 뒤에는 정렬 순서를 나타내는 ASC 또는 DESC 키워드 중 하나가 올 수 있어요. 정렬 순서는 데이터베이스 파일 형식, 특히 스키마 형식 번호에 따라 무시될 수도 있고 그렇지 않을 수도 있어요. "legacy" 스키마 형식(1)은 인덱스 정렬 순서를 무시해요. 내림차순 인덱스 스키마 형식(4)은 인덱스 정렬 순서를 고려해요. 3.3.0(2006-01-11) 이상의 SQLite 버전만 내림차순 인덱스 형식을 이해할 수 있어요. 호환성을 위해 3.3.0과 3.7.9 사이의 SQLite 버전은 기본적으로 legacy 스키마 형식을 사용해요. 3.7.10(2012-01-16) 이상 버전에서는 기본적으로 최신 스키마 형식을 사용해요. legacy_file_format pragma를 사용하면 모든 SQLite 버전에서 특정 동작을 변경하거나 설정할 수 있어요.
1.4. NULLS FIRST 및 NULLS LAST
NULLS FIRST 및 NULLS LAST 조건자는 인덱스에서 지원되지 않아요. 정렬 목적상 SQLite는 NULL 값을 다른 모든 값보다 작은 것으로 간주해요. 따라서 NULL 값은 항상 ASC 인덱스의 시작 부분과 DESC 인덱스의 끝 부분에 나타나요.
1.5. 데이터 정렬
각 열 이름이나 식 뒤에 선택적으로 오는 COLLATE 절은 해당 열의 텍스트 항목에 사용되는 데이터 정렬 순서(collating sequence)를 정의해요. 기본 데이터 정렬 순서는 CREATE TABLE 문에서 해당 열에 대해 정의된 데이터 정렬 순서예요. 달리 정의된 데이터 정렬 순서가 없다면 내장된 BINARY 데이터 정렬 순서가 사용돼요.
이 페이지는 2026-05-06 11:15:51Z에 마지막으로 업데이트되었어요.