0

我创建了这样的索引:

--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 并且索引不存在)

在此处输入图像描述

4

2 回答 2

2

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

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

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

几个地方的文档说明:

如果您不指定约束名称,则 Oracle 会为 SYS_Cn 形式的约束生成系统名称。

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

于 2013-01-16T17:23:10.900 回答
0

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

于 2013-01-16T15:56:25.967 回答