【问题标题】:Oracle SQL can't select my indexesOracle SQL 无法选择我的索引
【发布时间】:2013-01-16 15:41:03
【问题描述】:

我创建了这样的索引:

--CREATE INDEXES for Tables
CREATE UNIQUE INDEX worker_name_index ON WORKER (worker_id);
CREATE UNIQUE INDEX company_name_index ON COMPANY (company_name);
CREATE UNIQUE INDEX project_name_index ON PROJECT (project_id);

但是找不到索引在哪里:

SELECT * FROM USER_INDEXES;

也不在这里:

SELECT * FROM ALL_INDEXES;

也不在这里:

SELECT * FROM DBA_INDEXES;

而且也不能删除这些索引,因为删除会抛出 ORA-01418:specified index does not exist 错误。

--REMOVE INDEXES
DROP INDEX project_name_index;
DROP INDEX company_name_index;
DROP INDEX project_name_index;

并且无法重新创建,因为创建上升 ORA-01408:such columnt in list already indexed error...

已编辑(使用 select * all_ind_columns 且索引不存在)

【问题讨论】:

  • 您的意思是您在删除时收到错误,在重新创建时收到错误(已经存在)?您发布的 DDL 无效,因为其中有一个额外的“索引”关键字。
  • 是的,完全正确。而且我的意思是我不能用选择列出我的索引。但不知何故,它在某个地方“活”了,因为也不能用相同的名称重新创建它……我希望现在更清楚了。
  • 不,现在还不清楚。为什么不向我们展示一切包括您收到的错误消息(以及您正在运行的真实语句 - 正如 DazzaL 指出的那样,问题中的语句无效)。
  • 谢谢大家,你说得对,那是因为我在复制到这里时修改了查询,但我不会编辑以包含原始查询。
  • 那么哪个create 生成了ORA-01408?

标签: sql oracle indexing


【解决方案1】:

您的问题似乎有点误导,因为您永远无法成功创建这些命名索引。如您对all_ind_columns 的后续查询所示,例如:

select * from all_ind_columns
where table_name = 'WORKER' and column_name = 'WORKER_ID'

... 系统生成的索引已经存在于您尝试索引的列。名称(例如SYS_C0011015)表明它们是系统生成的针对表定义的主键(或可能是唯一的)约束的后备索引。

documentation 在几个地方的注释:

如果你没有指定一个约束名,那么 Oracle 会生成一个 SYS_Cn 形式的约束的系统名称。

所以你不能创建命名索引;如果表上已经存在约束,那么您将始终得到 ORA-01408,并且如果您在创建索引后尝试添加约束,则 alter 将失败。由于它们确实不存在,因此它们没有在all_indexes 中列出并且不能被删除是很合理的,并且您不能出于同样的原因重新创建它们,因为您一开始就无法创建它们......

【讨论】:

  • 完美。谢谢。这就是为什么我可以在 company_name 行上创建索引的原因,这不是主键...
【解决方案2】:

可能您创建索引时使用的 oracle 用户与您用于删除或选择此索引的用户不同。

【讨论】:

  • 很遗憾,我使用的是同一个 oracle 用户 (sysdba)。
猜你喜欢
  • 2020-06-22
  • 2020-01-22
  • 2012-01-02
  • 2012-02-15
  • 2020-05-29
  • 1970-01-01
  • 2020-04-06
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多