PostgreSQL: Pouvez-vous créer un index dans la définition CREATE TABLE?

105

Je souhaite ajouter des index à certaines des colonnes d'une table lors de la création. Existe-t-il un moyen de les ajouter à la définition CREATE TABLE ou dois-je les ajouter par la suite avec une autre requête?

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

Réponses:

120

Il ne semble pas y avoir de moyen de spécifier un index dans la CREATE TABLEsyntaxe. PostgreSQL crée cependant un index pour les contraintes uniques et les clés primaires par défaut, comme décrit dans cette note :

PostgreSQL crée automatiquement un index pour chaque contrainte unique et contrainte de clé primaire afin de renforcer l'unicité.

En dehors de cela, si vous souhaitez un index non unique, vous devrez le créer vous-même dans une CREATE INDEXrequête distincte .

débarrasser
la source
Merci, je ne connaissais pas la contrainte unique de créer un index.
Xeoncross
Notez que PostgreSQL prend en charge les mises à jour de schéma transactionnel - c'est une bonne idée de BEGIN / COMMIT autour de vos instructions CREATE TABLE et CREATE INDEX, si vous voulez que la création de la table globale nette réussisse ou échoue dans son ensemble.
mindplay.dk
22

Non.

Cependant, vous pouvez créer des uniqueindex lors de la création, mais c'est parce qu'ils sont classés comme contraintes . Vous ne pouvez pas créer un index "général".

Bohème
la source
6

Peter Krauss recherche une réponse canonique:

Il existe une SYNTAXE MODERNE (année 2020), veuillez donc expliquer et montrer des exemples, compatible avec postgresql.org/docs/current/sql-createtable.html

Vous recherchez une définition d'index en ligne , qui n'est pas disponible pour PostgreSQL jusqu'à la version actuelle 12. Sauf la contrainte UNIQUE / PRIMARY KEY, qui crée un index sous-jacent pour vous.

CRÉER UNE TABLE

[CONSTRAINT nom_contrainte] {CHECK (expression) [NO INHERIT] | UNIQUE (nom_colonne [, ...]) paramètres_index | PRIMARY KEY (nom_colonne [, ...]) paramètres_index |


Exemple de syntaxe de définition de colonne en ligne (ici 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
);

démo db <> fiddle

La justification de leur introduction est assez intéressante. Que sont les index en ligne? par Phil Factor

Lukasz Szozda
la source
Salut, résolu (!). Pouvez-vous ajouter quelque chose à propos de cas plus complexes, par exemple b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops).. comment ajouter plus de paramètres sans répéter le nom de la colonne?
Peter Krauss
@PeterKrauss L'exemple que j'ai fourni concerne SQL Server qui ne prend pas en charge gin_trgm_ops.
Lukasz Szozda
Salut @LukaszSzozda Pour la syntaxe, vous pouvez peut-être essayer de transformer n'importe quel type de complexe CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);en syntaxe de définition d'index en ligne . PS: cette question concerne PostgreSQL et non Microsoft-SQL-Server (voir les balises).
Peter Krauss
@PeterKrauss Je suis pleinement conscient que cette question concerne PostgreSQL. Je viens de vous donner un nom correct de cette fonctionnalité et de montrer un exemple à quoi cela pourrait ressembler. Espérons que plus de SGBDR supportera les index inlinde à l'avenir :)
Lukasz Szozda