PostgreSQL: Bisakah Anda membuat indeks dalam definisi CREATE TABLE?

105

Saya ingin menambahkan indeks ke beberapa kolom dalam tabel tentang pembuatan. Apakah ada cara untuk menambahkannya ke definisi CREATE TABLE atau apakah saya harus menambahkannya setelahnya dengan kueri lain?

CREATE INDEX reply_user_id ON reply USING btree (user_id);
Xeoncross
sumber

Jawaban:

118

Sepertinya tidak ada cara untuk menentukan indeks dalam CREATE TABLEsintaks. Namun PostgreSQL membuat indeks untuk batasan unik dan kunci utama secara default, seperti yang dijelaskan dalam catatan ini :

PostgreSQL secara otomatis membuat indeks untuk setiap batasan unik dan batasan kunci utama untuk menerapkan keunikan.

Selain itu, jika Anda menginginkan indeks non-unik, Anda harus membuatnya sendiri dalam CREATE INDEXkueri terpisah .

membersihkan
sumber
Terima kasih, saya tidak tahu tentang kendala unik dalam membuat indeks.
Xeoncross
Perhatikan bahwa PostgreSQL mendukung pembaruan skema transaksional - sebaiknya MULAI / KOMIT di sekitar pernyataan CREATE TABLE dan CREATE INDEX Anda, jika Anda ingin pembuatan tabel keseluruhan bersih berhasil atau gagal secara keseluruhan.
mindplay.dk
22

Tidak.

Namun, Anda dapat membuat uniqueindeks dalam pembuatan, tetapi itu karena mereka digolongkan sebagai batasan . Anda tidak dapat membuat indeks "umum".

Bohemian
sumber
6

Peter Krauss sedang mencari jawaban kanonik:

Ada SINTAX MODERN (tahun 2020), jadi tolong jelaskan dan tunjukkan contoh, kompatibel dengan postgresql.org/docs/current/sql-createtable.html

Anda sedang mencari definisi indeks sebaris , yang tidak tersedia untuk PostgreSQL hingga versi 12. Kecuali kendala UNIQUE / PRIMARY KEY, yang membuat indeks dasar untuk Anda.

BUAT TABEL

[CONSTRAINT constraint_name] {CHECK (ekspresi) [TANPA WARIS] | UNIQUE (nama_kolom [, ...]) parameter_indeks | KUNCI UTAMA (nama_kolom [, ...]) parameter_indeks |


Sintaks sampel definisi kolom sebaris (di sini 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 <> demo biola

Alasan di balik memperkenalkannya cukup menarik Apa itu Indeks Inline? oleh Phil Factor

Lukasz Szozda
sumber
Hai, solved (!). Dapatkah Anda menambahkan sesuatu tentang kasus yang lebih kompleks, misalnya b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops).. bagaimana menambahkan lebih banyak parameter tanpa mengulang nama kolom?
Peter Krauss
@PeterKrauss Contoh yang saya berikan adalah untuk SQL Server yang tidak mendukung gin_trgm_ops.
Lukasz Szozda
Hai @LukaszSzozda Untuk sintaks, mungkin Anda dapat mencoba mengubah segala jenis kompleks CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);menjadi sintaks definisi indeks sebaris . NB: pertanyaan ini tentang PostgreSQL bukan Microsoft-SQL-Server (lihat tag).
Peter Krauss
@PeterKrauss Saya sepenuhnya menyadari bahwa pertanyaan ini adalah tentang PostgreSQL. Saya baru saja memberi Anda nama yang tepat untuk fitur ini dan menunjukkan contoh bagaimana tampilannya. Semoga lebih banyak RDBMS akan mendukung indeks inlinde di masa mendatang :)
Lukasz Szozda