PostgreSQL: ¿Puede crear un índice en la definición CREATE TABLE?

105

Quiero agregar índices a algunas de las columnas de una tabla en el momento de la creación. ¿Hay alguna forma de agregarlos a la definición de CREAR TABLA o tengo que agregarlos después con otra consulta?

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

Respuestas:

118

No parece haber ninguna forma de especificar un índice en la CREATE TABLEsintaxis. Sin embargo, PostgreSQL crea un índice para restricciones únicas y claves primarias de forma predeterminada, como se describe en esta nota :

PostgreSQL crea automáticamente un índice para cada restricción única y restricción de clave principal para hacer cumplir la singularidad.

Aparte de eso, si desea un índice no único, deberá crearlo usted mismo en una CREATE INDEXconsulta separada .

eliminar
fuente
Gracias, no sabía sobre la restricción única que crea un índice.
Xeoncross
Tenga en cuenta que PostgreSQL admite actualizaciones de esquemas transaccionales; es una buena idea BEGIN / COMMIT alrededor de sus declaraciones CREATE TABLE y CREATE INDEX, si desea que la creación de la tabla global neta tenga éxito o falle en su totalidad.
mindplay.dk
22

No.

Sin embargo, puede crear uniqueíndices en la creación, pero eso se debe a que están clasificados como restricciones . No puede crear un índice "general".

Bohemio
fuente
6

Peter Krauss busca una respuesta canónica:

Hay una SINTAXIS MODERNA (año 2020), así que explique y muestre ejemplos, compatible con postgresql.org/docs/current/sql-createtable.html

Está buscando una definición de índice en línea , que no está disponible para PostgreSQL hasta la versión actual 12. Excepto la restricción UNIQUE / PRIMARY KEY, que crea un índice subyacente para usted.

CREAR MESA

[RESTRICCIÓN nombre_restricción] {CHECK (expresión) [NO HEREDA] | UNIQUE (column_name [, ...]) index_parameters | CLAVE PRIMARIA (nombre_columna [, ...]) parámetros_índice |


La sintaxis de muestra de la definición de columna en línea (aquí 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 <> demostración de violín

La razón de ser de su introducción es bastante interesante. ¿Qué son los índices en línea? por Phil Factor

Lukasz Szozda
fuente
Hola, resuelto (!). ¿Puede agregar algo sobre un caso más complejo, por ejemplo b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops)... cómo agregar más parámetros sin repetir el nombre de la columna?
Peter Krauss
@PeterKrauss El ejemplo que proporcioné es para SQL Server que no es compatible con gin_trgm_ops.
Lukasz Szozda
Hola @LukaszSzozda Para la sintaxis, tal vez puedas intentar transformar cualquier tipo de complejo CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);en sintaxis de definición de índice en línea . PD: esta pregunta es sobre PostgreSQL, no sobre Microsoft-SQL-Server (ver etiquetas).
Peter Krauss
@PeterKrauss Soy plenamente consciente de que esta pregunta es sobre PostgreSQL. Le acabo de dar un nombre propio de esta función y le muestro un ejemplo de cómo podría verse. Esperemos que más RDBMS admitan índices inlinde en el futuro :)
Lukasz Szozda