PostgreSQL:您可以在创建表定义中创建索引吗?

PostgreSQL:您可以在创建表定义中创建索引吗?,postgresql,database-schema,database-indexes,Postgresql,Database Schema,Database Indexes,我想在创建时为表中的某些列添加索引。是否有方法将它们添加到创建表定义中,还是必须在之后使用另一个查询添加它们 CREATE INDEX reply_user_id ON reply USING btree (user_id); 没有 但是,您可以在create中创建unique索引,但这是因为它们被归类为约束。无法创建“常规”索引。在创建表语法中似乎没有任何方法指定索引。但是,默认情况下,PostgreSQL会为唯一约束和主键创建索引,如中所述: PostgreSQL自动为每个唯一约束和主键约

我想在创建时为表中的某些列添加索引。是否有方法将它们添加到创建表定义中,还是必须在之后使用另一个查询添加它们

CREATE INDEX reply_user_id ON reply USING btree (user_id);
没有


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

创建表
语法中似乎没有任何方法指定索引。但是,默认情况下,PostgreSQL会为唯一约束和主键创建索引,如中所述:

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

除此之外,如果需要非唯一索引,则需要在单独的
createindex
查询中自己创建

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

有一种现代语法(2020年),因此请解释并展示与postgresql.org/docs/current/sql-createtable.html兼容的示例

您正在搜索内联索引定义,该定义在当前版本12之前的PostgreSQL中不可用。除了唯一/主键约束之外,它为您创建基础索引

[约束名称] {检查(表达式)[无继承]| 唯一(列名称[,…])索引参数| 主键(列名称[,…])索引参数|


内联列定义的示例语法(此处为SQL Server):


介绍它们的基本原理非常有趣

谢谢,我不知道创建索引的唯一约束。请注意,PostgreSQL支持事务性架构更新-如果希望整个网络表创建成功或失败,最好开始/提交CREATE TABLE和CREATE index语句整体。嗨,已解决(!)。您可以添加一些关于更复杂情况的内容吗,例如
b VARCHAR(10)NOT NULL INDEX idx\u tab\u b gin(b gin\u trgm\u ops)
。如何在不重复列名的情况下添加更多参数?@PeterKrauss我提供的示例适用于不支持gin_trgm_ops.Hi@LukaszSzozda语法的SQL Server,也许您可以尝试使用MethodName(fieldName optionName)在tableName上转换任何类型的复杂
创建索引idxName;
转换为内联索引定义的语法。PS:这个问题是关于PostgreSQL而不是Microsoft SQL Server的(请参阅标记)。@PeterKrauss我完全知道这个问题是关于PostgreSQL的。我刚刚给了你这个功能的正确名称,并举例说明它是什么样子。希望将来有更多的RDBMS支持内联索引:)
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
);