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

PostgreSQLはトランザクションスキーマの更新をサポートしていることに注意してください。ネット全体のテーブル作成を全体として成功または失敗させたい場合は、CREATE TABLEおよびCREATE INDEXステートメントをBEGIN / COMMITすることをお勧めします。
mindplay.dk

22

番号。

ただし、createでuniqueインデックスを作成できますが、これは、それらが制約として分類されているためです。「一般」インデックスを作成することはできません。


5

Peter Kraussは正解を探しています。

現代の構文(2020年)があるので、postgresql.org / docs / current / sql-createtable.htmlと互換性のある例を説明して示してください

現在のバージョン12までのPostgreSQLでは使用できないインラインインデックス定義を検索しています。UNIQUE/ PRIMARY KEY制約を除き、基礎となるインデックスが作成されます。

テーブルを作成

[CONSTRAINT constraint_name] {CHECK(expression)[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 <> fiddleデモ

それらを導入する背後にある理論的根拠は非常に興味深いですインラインインデックスとは何ですか?フィル・ファクター


こんにちは、解決しました(!)より複雑なケースについて何かを追加できます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);インラインインデックス定義の構文に変換しようとすることができます。PS:この質問はMicrosoft-SQL-ServerではなくPostgreSQLに関するものです(タグを参照)。
Peter Krauss

@PeterKrauss私はこの質問がPostgreSQLに関するものであることを完全に認識しています。私はあなたにこの機能の適切な名前を与え、これがどのように見えるか例を示しました。今後、より多くのRDBMSがインリンデインデックスをサポートすることを願っています:)
Lukasz Szozda
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.