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
);