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:
CREATE TABLE
Sö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 INDEX
sorguda kendiniz oluşturmanız gerekecektir .
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.
[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
);
Bunları tanıtmanın arkasındaki mantık oldukça ilginç. Inline Indexes nedir? Phil Factor tarafından
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?
CREATE 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).