【问题标题】:create index on creation of table in Oracle在 Oracle 中创建表时创建索引
【发布时间】:2020-06-02 11:30:26
【问题描述】:

在 MySql 中,可以在(非唯一)列和表上创建索引,例如

create table orders(
   orderid varchar(20) not null unique,
   customerid varchar(20),
   index(customerid)
   );

在 Oracle 中没有找到相应的选项,即在创建表时创建索引而不是之后作为单独的命令,我怀疑这是不可能的。它是否正确?如果是这样,这背后的原因是什么 - 效率,例如这里讨论的 Insertion of data after creating index on empty table or creating unique index after inserting data on oracle? ? 提前致谢!

【问题讨论】:

    标签: mysql oracle indexing


    【解决方案1】:

    除了定义为主要或唯一约束的一部分的索引之外,似乎没有一种方法可以将索引定义为 Oracle 中 CREATE TABLE 语句的一部分。尽管USING INDEX 子句是CREATE TABLE 语句的constraint-state 元素的一部分,但如果您尝试在除PRIMARY 或UNIQUE 约束之外的任何约束定义中包含USING INDEX 子句-@,则会发出missing right parenthesis 错误。例如 987654321@。

    至于“为什么”——这是一个只有 Oracle 架构团队的人才可以回答的问题。从我个人面向用户的角度来看,我认为能够创建索引作为 CREATE TABLE 语句的一部分并没有什么特别的价值,但是我已经习惯了 Oracle 的工作方式,并且我的思维模式也以此为导向方向。 YMMV。

    【讨论】:

      【解决方案2】:

      差异的根本原因在于 MySQL 和 Oracle 是两个截然不同的产品,由不同的软件工程团队在不同的时间开发。在这种情况下,MySQL 归甲骨文所有的事实毫无意义。 MySQL 是一个单独开发的产品,后来被甲骨文收购。至于为什么这两个独立且截然不同的设计团队做出他们所做的决定......你必须问他们。但我很确定这与您所建议的运营效率无关。创建表和索引后,将索引创建为 CREATE TABLE 的一部分与单独创建索引没有区别。因此,该表上的任何 DML 的效率都没有差异。

      【讨论】:

      • 好的,谢谢,但无论如何,在Oracle中创建表时不能生成索引是真的吗?
      • 我看到 CREATE TABLE 语法中的注释表明您可以显式创建和索引作为 CREATE TABLE 语句的一部分。如果作为 CREATE TABLE 的一部分,您将列指定为 PK 或 UK,oracle 将自动创建索引以强制执行该约束。但是不,您不能只将 CREATE INDEX 嵌入到 CREATE TABLE 中。
      • 在某些情况下,先填充表然后构建索引的效率要高得多。在 MySQL 中,FULLTEXT 喜欢这样,SPATIAL 要求这样。另一方面,BTree 在增量构建方面做得相当好。
      • @RickJames - 但同样是在创建表之后。索引是作为 CREATE TABLE 的一部分创建的,还是作为单独的 CREATE INDEX 创建的,一旦创建了表和索引,使用哪种机制到达那里都没有关系。
      猜你喜欢
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2011-10-23
      • 2011-03-05
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 2017-11-16
      相关资源
      最近更新 更多