PostgreSQL:你能在CREATE TABLE定义中创建一个索引吗?

时间:2011-06-04 21:58:53

标签: postgresql database-schema database-indexes

我想在创建时为表中的某些列添加索引。有没有办法将它们添加到CREATE TABLE定义中,或者我之后是否必须使用其他查询添加它们?

CREATE INDEX reply_user_id ON reply USING btree (user_id);

3 个答案:

答案 0 :(得分:88)

似乎没有任何方法可以在CREATE TABLE语法中指定索引。但是,PostgreSQL默认为唯一约束和主键创建索引,如this note中所述:

  

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

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

答案 1 :(得分:16)

没有

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

答案 2 :(得分:9)

Peter Krauss正在寻找一个规范的答案:

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

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

CREATE TABLE

[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 demo

介绍它们的原理非常有趣What are Inline Indexes? by Phil Factor