PostgreSQL: CREATE TABLE tanımında bir indeks oluşturabilir misiniz?


105

Oluşturma sırasında bir tablodaki bazı sütunlara dizin eklemek istiyorum. Bunları CREATE TABLE tanımına eklemenin bir yolu var mı yoksa daha sonra başka bir sorgu ile eklemem mi gerekiyor?

CREATE INDEX reply_user_id ON reply USING btree (user_id);

Yanıtlar:


120

CREATE TABLESözdiziminde bir dizin belirtmenin herhangi bir yolu yok gibi görünüyor . Ancak PostgreSQL, bu notta açıklandığı gibi varsayılan olarak benzersiz kısıtlamalar ve birincil anahtarlar için bir dizin oluşturur :

PostgreSQL, benzersizliği sağlamak için her benzersiz kısıtlama ve birincil anahtar kısıtlaması için otomatik olarak bir dizin oluşturur.

Bunun dışında, benzersiz olmayan bir dizin istiyorsanız, bunu ayrı bir CREATE INDEXsorguda kendiniz oluşturmanız gerekecektir .


Teşekkürler, endeks oluşturan benzersiz kısıtlamayı bilmiyordum.
Xeoncross

PostgreSQL'in işlemsel şema güncellemelerini desteklediğine dikkat edin - net genel tablo oluşturma işleminin bir bütün olarak başarılı olmasını veya başarısız olmasını istiyorsanız, CREATE TABLE ve CREATE INDEX ifadelerinizin etrafında BEGIN / COMMIT yapmak iyi bir fikirdir.
mindplay.dk

22

Hayır.

Bununla birlikte, oluşturma sırasında uniquedizinler oluşturabilirsiniz, ancak bunun nedeni kısıtlamalar olarak sınıflandırılmalarıdır . "Genel" bir dizin oluşturamazsınız.


6

Peter Krauss kanonik bir cevap arıyor:

MODERN SÖZDİZİM (2020 yılı) vardır, bu yüzden lütfen postgresql.org/docs/current/sql-createtable.html ile uyumlu örnekleri açıklayın ve gösterin

Mevcut sürüm 12'ye kadar PostgreSQL için mevcut olmayan satır içi dizin tanımını arıyorsunuz . Sizin için temel indeks oluşturan UNIQUE / PRIMARY KEY kısıtlaması dışında.

TABLO OLUŞTUR

[CONSTRAINT kısıt_adı] {CHECK (ifade) [INHERIT YOK] | BENZERSİZ (sütun_adı [, ...]) dizin_parametreleri | BİRİNCİL ANAHTAR (sütun_adı [, ...]) dizin_parametreleri |


Satır içi sütun tanımının örnek sözdizimi (burada 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 demosu

Bunları tanıtmanın arkasındaki mantık oldukça ilginç. Inline Indexes nedir? Phil Factor tarafından


Merhaba, çözüldü (!). Daha karmaşık durum hakkında bir şeyler ekleyebilir misiniz, örneğin b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops).. sütun adını tekrar etmeden daha fazla parametre nasıl eklenir?
Peter Krauss

@PeterKrauss Sağladığım örnek, gin_trgm_ops'u desteklemeyen SQL Server içindir.
Lukasz Szozda

Merhaba @LukaszSzozda Sözdizimi için, belki her tür kompleksi satır içi dizin tanımınınCREATE INDEX idxName ON tableName USING MethodName (fieldName optionName); sözdizimine dönüştürmeyi deneyebilirsiniz . Not: Bu soru PostgreSQL ile ilgilidir, Microsoft-SQL-Server ile değil (etiketlere bakın).
Peter Krauss

@PeterKrauss Bu sorunun PostgreSQL ile ilgili olduğunun tamamen farkındayım. Size bu özelliğin tam adını verdim ve bunun nasıl görünebileceğine dair bir örnek gösterdim. Daha fazla RDBMS'nin gelecekte inlinde dizinlerini destekleyeceğini umalım :)
Lukasz Szozda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.