PostgreSQL:可以在CREATE TABLE定义中创建索引吗?


104

我想在创建时向表中的某些列添加索引。有什么方法可以将它们添加到CREATE TABLE定义中,还是必须在以后通过另一个查询将它们添加?

CREATE INDEX reply_user_id ON reply USING btree (user_id);

Answers:


117

似乎没有任何方法可以在CREATE TABLE语法中指定索引。但是,PostgreSQL确实在默认情况下为唯一约束和主键创建了一个索引,如本说明中所述

PostgreSQL自动为每个唯一性约束和主键约束创建索引以强制唯一性。

除此之外,如果您要使用非唯一索引,则需要在单独的CREATE INDEX查询中自行创建索引。


谢谢,我不知道创建索引的唯一约束。
Xeoncross 2011年

请注意,PostgreSQL支持事务性模式更新-如果您希望整个整体表的创建成功或失败,最好在CREATE TABLE和CREATE INDEX语句周围进行BEGIN / COMMIT。
mindplay.dk

22

没有。

但是,您可以在create中创建unique索引,但这是因为它们被归类为Constraints。您无法创建“常规”索引。


5

彼得·克劳斯(Peter Krauss)正在寻找一个规范的答案:

有一个现代语法(2020年),所以请解释并显示示例,与postgresql.org/docs/current/sql-createtable.html兼容

您正在搜索内联索引定义,该索引定义在当前版本12之前的PostgreSQL中不可用。除UNIQUE / PRIMARY KEY约束外,该内联索引定义会为您创建基础索引。

创建表

[CONSTRAINT约束名称] {检查(表达式)[否继承] | UNIQUE(column_name [,...])index_parameters | 主键(column_name [,...])index_parameters |


内联列定义的示例语法(此处为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演示

引入它们的原理很有趣。什么是内联索引?通过Phil Factor


嗨,解决了(!)。您能否添加一些更复杂的情况,例如b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops)..如何在不重复列名的情况下添加更多参数?
彼得·克劳斯

@PeterKrauss我提供的示例适用于不支持gin_trgm_ops的SQL Server。
Lukasz Szozda

@LukaszSzozda,您好:对于语法,也许您可​​以尝试将任何复杂类型CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);转换为内联索引定义的语法。PS:这个问题是关于PostgreSQL而不是Microsoft-SQL-Server(请参阅标签)。
彼得·克劳斯

@PeterKrauss我完全知道这个问题是关于PostgreSQL的。我刚刚给您提供了此功能的适当名称,并显示了示例。我们希望将来有更多的RDBMS支持inlinde索引:)
Lukasz Szozda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.