PostgreSQL: puoi creare un indice nella definizione CREATE TABLE?


105

Voglio aggiungere indici ad alcune delle colonne in una tabella durante la creazione. C'è un modo per aggiungerli alla definizione CREATE TABLE o devo aggiungerli in seguito con un'altra query?

CREATE INDEX reply_user_id ON reply USING btree (user_id);

Risposte:


118

Non sembra esserci alcun modo per specificare un indice nella CREATE TABLEsintassi. PostgreSQL, tuttavia, crea un indice per vincoli univoci e chiavi primarie per impostazione predefinita, come descritto in questa nota :

PostgreSQL crea automaticamente un indice per ogni vincolo univoco e vincolo di chiave primaria per rafforzare l'unicità.

Oltre a questo, se desideri un indice non univoco, dovrai crearlo tu stesso in una CREATE INDEXquery separata .


Grazie, non sapevo del vincolo univoco che crea un indice.
Xeoncross

Nota che PostgreSQL supporta gli aggiornamenti dello schema transazionale: è una buona idea BEGIN / COMMIT attorno alle tue istruzioni CREATE TABLE e CREATE INDEX, se vuoi che la creazione complessiva della tabella netta abbia successo o fallisca nel suo complesso.
mindplay.dk

22

No.

Tuttavia, puoi creare uniqueindici nella creazione, ma questo perché sono classificati come vincoli . Non puoi creare un indice "generale".


6

Peter Krauss sta cercando una risposta canonica:

Esiste una SINTASSI MODERNA (anno 2020), quindi spiega e mostra esempi, compatibile con postgresql.org/docs/current/sql-createtable.html

Stai cercando la definizione dell'indice in linea , che non è disponibile per PostgreSQL fino alla versione corrente 12. Eccetto il vincolo UNIQUE / PRIMARY KEY, che crea l'indice sottostante per te.

CREA TABELLA

[CONSTRAINT nome_vincolo] {CHECK (espressione) [NO INHERIT] | UNIQUE (nome_colonna [, ...]) parametri_indice | CHIAVE PRIMARIA (nome_colonna [, ...]) parametri_indice |


La sintassi di esempio della definizione di colonna inline (qui 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 demo

La logica alla base della loro introduzione è piuttosto interessante Cosa sono gli indici in linea? di Phil Factor


Ciao, risolto (!). Puoi aggiungere qualcosa su un caso più complesso, ad esempio b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops).. come aggiungere più parametri senza ripetere il nome della colonna?
Peter Krauss il

@PeterKrauss L'esempio fornito è per SQL Server che non supporta gin_trgm_ops.
Lukasz Szozda

Ciao @LukaszSzozda Per la sintassi, forse puoi provare a trasformare qualsiasi tipo di complesso CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);nella sintassi della definizione dell'indice in linea . PS: questa domanda riguarda PostgreSQL e non Microsoft-SQL-Server (vedi tag).
Peter Krauss,

@PeterKrauss Sono pienamente consapevole che questa domanda riguarda PostgreSQL. Ti ho appena dato un nome proprio di questa funzione e mostrato un esempio di come potrebbe apparire. Speriamo che più RDBMS supporterà gli indici inlinde in futuro :)
Lukasz Szozda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.