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

Xeo*_*oss 90 postgresql database-schema database-indexes

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

CREATE INDEX reply_user_id ON reply USING btree (user_id);
Run Code Online (Sandbox Code Playgroud)

rid*_*rid 102

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

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

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

  • 请注意,PostgreSQL 支持事务模式更新 - 如果您希望整个表创建成功或失败,最好在 CREATE TABLE 和 CREATE INDEX 语句周围进行 BEGIN/COMMIT。 (2认同)

Boh*_*ian 20

没有.

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


Luk*_*zda 12

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

有一个 MODERN SYNTAX (year 2020),所以请解释和展示例子,兼容 postgresql.org/docs/current/sql-createtable.html

您正在搜索内联索引定义,它不适用于 PostgreSQL 直到当前版本 12。除了 UNIQUE/PRIMARY KEY 约束,它为您创建基础索引。

创建表

[CONSTRAINTconstraint_name] {检查(表达式)[NO INHERIT] | UNIQUE ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( 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
);
Run Code Online (Sandbox Code Playgroud)

db<>小提琴演示

引入它们背后的基本原理非常有趣什么是内联索引?菲尔因素