【问题标题】:Can not set Sorted ASC Index on primary key field in oracle无法在 oracle 中的主键字段上设置排序 ASC 索引
【发布时间】:2012-03-21 10:01:11
【问题描述】:

当我尝试在字段 MyId 上添加排序的 ASC 索引时,oracle sql 开发人员工具会说:

Index MyIdSortedIndex is defined identically to constraint PK_MyTable


CREATE TABLE MyTable 
   (    "MyId" NVARCHAR2(50), 
    "DESCRIPTION" NVARCHAR2(200), 
     CONSTRAINT "PK_MyTable" PRIMARY KEY ("MyId")  
   )

如何在 Oracle 中的主键 MyId 上设置排序的 ASC 索引?

【问题讨论】:

  • 为什么要使用混合大小写的名称,例如“MyId”?除非有充分的理由,否则它会给 Oracle 带来很多不便。

标签: oracle indexing primary-key sorted


【解决方案1】:

它告诉您不需要新索引,因为您已经在“MyId”上按升序创建了一个名为“PK_MyTable”的索引。当您向表中添加主键约束时,Oracle 会自动添加同名索引以帮助强制执行,按升序索引约束的列(因为升序是默认方向)。

如果您不想使用 Oracle 自动创建的索引,您可以这样做:

CREATE TABLE MyTable 
   (    "MyId" NVARCHAR2(50), 
    "DESCRIPTION" NVARCHAR2(200), 
   );

CREATE INDEX MyIdSortedIndex ON MyTable ("MyId" ASC);

ALTER TABLE MyTable Add CONSTRAINT "PK_MyTable" PRIMARY KEY ("MyId");

由于添加主键时您的索引已经存在,Oracle 将使用它而不是创建自己的索引。

【讨论】:

  • 在oracle创建的oracle sql developer tool中看不到额外的索引。 MyId 不能以排序方式索引,否则我会以排序方式返回我的数据。它从字面上告诉我:“索引 MyIdSortedIndex 的定义与约束 PK_MyTable 相同”。
  • 必须有,因为(a)没有索引就不能有主键约束,(b)Oracle 说有!您不会仅仅因为存在索引而以任何特定方式对返回的数据进行排序,如果您在 select 语句中指定 ORDER BY 子句,您只会获得以特定方式排序的数据。
  • @TonyAndrews,作为对您的 (a) 的回应,有人可能创建了一个 PK 然后删除了索引是不可能的(尽管极不可能!)?所以你可以有一个没有索引的PK?
  • @Ollie,我不这么认为,因为 Oracle 不会让您删除用于强制执行主键的索引。
  • @Pascal,对不起,但你不能,这只是生活中的事实。索引是一种帮助 Oracle 高效回答查询的设备,它不会对所有的 select 语句强加一个顺序。
猜你喜欢
  • 2021-10-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多