PostgreSQL: Können Sie einen Index in der Definition CREATE TABLE erstellen?

104

Ich möchte bei der Erstellung einigen Spalten in einer Tabelle Indizes hinzufügen. Gibt es eine Möglichkeit, sie zur Definition von CREATE TABLE hinzuzufügen, oder muss ich sie anschließend mit einer anderen Abfrage hinzufügen?

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

Antworten:

117

Es scheint keine Möglichkeit zu geben, einen Index in der CREATE TABLESyntax anzugeben . PostgreSQL erstellt jedoch standardmäßig einen Index für eindeutige Einschränkungen und Primärschlüssel, wie in diesem Hinweis beschrieben :

PostgreSQL erstellt automatisch einen Index für jede eindeutige Einschränkung und Primärschlüsseleinschränkung, um die Eindeutigkeit zu erzwingen.

Wenn Sie einen nicht eindeutigen Index wünschen, müssen Sie ihn in einer separaten CREATE INDEXAbfrage selbst erstellen .

loswerden
quelle
Vielen Dank, ich wusste nichts über die eindeutige Einschränkung beim Erstellen eines Index.
Xeoncross
Beachten Sie, dass PostgreSQL Transaktionsschema-Updates unterstützt. Es empfiehlt sich, die Anweisungen CREATE TABLE und CREATE INDEX mit BEGIN / COMMIT zu beginnen, wenn die Erstellung der gesamten Netto-Tabelle insgesamt erfolgreich sein oder fehlschlagen soll.
mindplay.dk
22

Nein.

Sie können zwar uniqueIndizes in create erstellen, dies liegt jedoch daran, dass sie als Einschränkungen klassifiziert sind . Sie können keinen "allgemeinen" Index erstellen.

Böhmisch
quelle
5

Peter Krauss sucht nach einer kanonischen Antwort:

Es gibt eine MODERNE SYNTAX (Jahr 2020). Bitte erläutern und zeigen Sie Beispiele, die mit postgresql.org/docs/current/sql-createtable.html kompatibel sind

Sie suchen nach einer Inline-Indexdefinition , die für PostgreSQL bis zur aktuellen Version 12 nicht verfügbar ist. Mit Ausnahme der Einschränkung UNIQUE / PRIMARY KEY wird ein zugrunde liegender Index für Sie erstellt.

TABELLE ERSTELLEN

[CONSTRAINT Constraint_Name] {CHECK (Ausdruck) [NO INHERIT] | UNIQUE (Spaltenname [, ...]) Indexparameter | PRIMARY KEY (Spaltenname [, ...]) Indexparameter |


Die Beispielsyntax der Inline-Spaltendefinition (hier 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 <> Geigen-Demo

Die Gründe für ihre Einführung sind sehr interessant. Was sind Inline-Indizes? von Phil Factor

Lukasz Szozda
quelle
Hallo, gelöst (!). Können Sie etwas über komplexere Fälle hinzufügen, zum Beispiel, b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops)wie Sie weitere Parameter hinzufügen können, ohne den Spaltennamen zu wiederholen?
Peter Krauss
@PeterKrauss Das Beispiel, das ich bereitgestellt habe, ist für SQL Server, der gin_trgm_ops nicht unterstützt.
Lukasz Szozda
Hi @LukaszSzozda Für die Syntax können Sie vielleicht versuchen, jede Art von Komplex CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);in die Syntax der Inline- Indexdefinition umzuwandeln . PS: Diese Frage bezieht sich auf PostgreSQL, nicht auf Microsoft-SQL-Server (siehe Tags).
Peter Krauss
@PeterKrauss Mir ist völlig bewusst, dass es sich bei dieser Frage um PostgreSQL handelt. Ich habe Ihnen nur einen richtigen Namen für diese Funktion gegeben und ein Beispiel gezeigt, wie dies aussehen könnte. Hoffen wir, dass in Zukunft weitere RDBMS Inlinde-Indizes unterstützen werden :)
Lukasz Szozda