【发布时间】:2011-09-08 12:57:39
【问题描述】:
我想在创建时为表中的某些列添加索引。有没有办法将它们添加到 CREATE TABLE 定义中,还是我必须在之后使用另一个查询添加它们?
CREATE INDEX reply_user_id ON reply USING btree (user_id);
【问题讨论】:
标签: postgresql
我想在创建时为表中的某些列添加索引。有没有办法将它们添加到 CREATE TABLE 定义中,还是我必须在之后使用另一个查询添加它们?
CREATE INDEX reply_user_id ON reply USING btree (user_id);
【问题讨论】:
标签: postgresql
没有。
但是,您可以在创建中创建unique 索引,但这是因为它们被归类为约束。您不能创建“通用”索引。
【讨论】:
似乎没有任何方法可以在CREATE TABLE 语法中指定索引。然而,PostgreSQL 默认为唯一约束和主键创建索引,如this note 中所述:
PostgreSQL 自动为每个唯一约束和主键约束创建索引以强制唯一性。
除此之外,如果您想要一个非唯一索引,则需要在单独的CREATE INDEX 查询中自己创建它。
【讨论】:
彼得克劳斯正在寻找一个规范的答案:
有一个现代语法(2020 年),所以请解释并显示示例,与 postgresql.org/docs/current/sql-createtable.html 兼容
您正在搜索内联索引定义,它在当前版本 12 之前的 PostgreSQL 中不可用。除了 UNIQUE/PRIMARY KEY 约束,它会为您创建底层索引。
[ CONSTRAINT 约束名称 ] {检查(表达式)[无继承]| 唯一(列名 [, ... ] ) 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
);
介绍它们的理由很有趣What are Inline Indexes? by Phil Factor
【讨论】:
b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops) ..如何添加更多参数而不重复列名?
CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName); 转换为内联索引定义的语法。 PS:这个问题是关于 PostgreSQL 而不是 Microsoft-SQL-Server(见标签)。