PostgreSQL : CREATE TABLE 정의에서 인덱스를 생성 할 수 있습니까?


104

생성시 테이블의 일부 열에 인덱스를 추가하고 싶습니다. CREATE TABLE 정의에 추가하는 방법이 있습니까? 아니면 나중에 다른 쿼리로 추가해야합니까?

CREATE INDEX reply_user_id ON reply USING btree (user_id);

답변:


117

CREATE TABLE구문에 색인을 지정하는 방법이없는 것 같습니다 . 그러나 PostgreSQL 은이 노트에 설명 된대로 기본적으로 고유 제약 조건 및 기본 키에 대한 인덱스를 생성합니다 .

PostgreSQL은 고유성을 강화하기 위해 각 고유 제약 조건 및 기본 키 제약 조건에 대한 인덱스를 자동으로 생성합니다.

그 외에 고유하지 않은 인덱스를 원할 경우 별도의 CREATE INDEX쿼리 에서 직접 생성해야 합니다.


감사합니다. 인덱스를 생성하는 고유 제약 조건에 대해 몰랐습니다.
Xeoncross 2011 년

PostgreSQL은 트랜잭션 스키마 업데이트를 지원합니다. 전체적으로 전체 테이블 생성이 성공하거나 실패하도록하려면 CREATE TABLE 및 CREATE INDEX 문 주위에서 BEGIN / COMMIT하는 것이 좋습니다.
mindplay.dk

22

아니.

그러나 create에서 unique인덱스를 만들 수 있지만 제약 조건 으로 분류되기 때문 입니다. "일반"색인을 만들 수 없습니다.


6

Peter Krauss는 정식 답변을 찾고 있습니다.

현대 구문 (2020 년)이 있으므로 postgresql.org/docs/current/sql-createtable.html과 호환되는 예제를 설명하고 보여주십시오.

현재 버전 12까지는 PostgreSQL에서 사용할 수없는 인라인 인덱스 정의를 검색 하고 있습니다. UNIQUE / PRIMARY KEY 제약 조건을 제외하고는 기본 인덱스를 생성합니다.

테이블 만들기

[CONSTRAINT 제약 이름] {CHECK (표현식) [NO INHERIT] | UNIQUE (column_name [, ...]) index_parameters | PRIMARY KEY (column_name [, ...]) index_parameters |


인라인 열 정의의 샘플 구문 (여기서는 SQL Server) :

CREATE TABLE tab(
  id INT PRIMARY KEY,                            -- constraint
  c INT INDEX filtered (c) WHERE c > 10,         -- filtered index
  b VARCHAR(10) NOT NULL INDEX idx_tab_b,        -- index on column
  d VARCHAR(20) NOT NULL,
  INDEX my_index NONCLUSTERED(d)                 -- index on column as separate entry
);

db <> 바이올린 데모

그것들을 도입 한 이유는 매우 흥미 롭습니다. 인라인 인덱스 란 무엇입니까? 필 팩터


안녕하세요, 해결되었습니다 (!). 예를 들어 b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops).. 반복되는 열 이름없이 더 많은 매개 변수를 추가하는 방법과 같이 더 복잡한 케이스에 대해 추가 할 수 있습니까 ?
Peter Krauss

@PeterKrauss 내가 제공 한 예제는 gin_trgm_ops를 지원하지 않는 SQL Server 용입니다.
Lukasz Szozda

안녕하세요 @LukaszSzozda 구문의 경우 모든 종류의 복잡한 CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);것을 인라인 인덱스 정의 구문으로 변환 할 수 있습니다 . 추신 :이 질문은 Microsoft-SQL-Server가 아닌 PostgreSQL에 관한 것입니다 (태그 참조).
Peter Krauss

@PeterKrauss 나는이 질문이 PostgreSQL에 관한 것임을 완전히 알고 있습니다. 이 기능의 적절한 이름을 지정하고 이것이 어떻게 생겼는지 예를 보여 드리겠습니다. 앞으로 더 많은 RDBMS가 인라인 인덱스를 지원하기를 바랍니다. :)
Lukasz Szozda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.