【问题标题】:Can you create an index in the CREATE TABLE definition?您可以在 CREATE TABLE 定义中创建索引吗?
【发布时间】:2011-09-08 12:57:39
【问题描述】:

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

CREATE INDEX reply_user_id ON reply USING btree (user_id);

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    没有。

    但是,您可以在创建中创建unique 索引,但这是因为它们被归类为约束。您不能创建“通用”索引。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢,我不知道创建索引的唯一约束。
      • 请注意,PostgreSQL 支持事务模式更新 - 如果您希望网络整体表创建作为一个整体成功或失败,那么围绕您的 CREATE TABLE 和 CREATE INDEX 语句开始/提交是个好主意。
      【解决方案3】:

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

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

      您正在搜索内联索引定义,它在当前版本 12 之前的 PostgreSQL 中不可用。除了 UNIQUE/PRIMARY KEY 约束,它会为您创建底层索引。

      CREATE TABLE

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

      db<>fiddle demo

      介绍它们的理由很有趣What are Inline Indexes? by Phil Factor

      【讨论】:

      • 嗨,解决了(!)。你能添加一些关于更复杂情况的东西,例如b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops) ..如何添加更多参数而不重复列名?
      • @PeterKrauss 我提供的示例是针对不支持 gin_trgm_ops 的 SQL Server。
      • 嗨@LukaszSzozda 对于语法,也许您可​​以尝试将任何复杂的CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName); 转换为内联索引定义的语法。 PS:这个问题是关于 PostgreSQL 而不是 Microsoft-SQL-Server(见标签)。
      • @PeterKrauss 我完全知道这个问题是关于 PostgreSQL 的。我只是给了你这个功能的正确名称,并展示了它的外观示例。希望未来有更多的 RDBMS 支持内联索引 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      相关资源
      最近更新 更多