【求助】oracle中sql语句 此列列表已索引的解决办法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【求助】oracle中sql语句 此列列表已索引的解决办法相关的知识,希望对你有一定的参考价值。

在oracle数据库中,现在已经有student和lesson两个表,还有一个stu_choose_lesson表,这个表建表如下:

create table stu_choose_lesson(
studentNum VARCHAR2(16) not null,
lessonNum VARCHAR2(16) not null,
primary key(studentNum,lessonNum),
foreign key(studentNum) references student,
foreign key(lessonNum) references lesson
);

现在需要在stu_choose_lesson表中依据“studentNum”和“lessonNum”字段创建索引,写出如下语句:

create UNIQUE INDEX stu_choose_lesson_Ind
on stu_choose_lesson(studentNum,lessonNum);

执行的时候报错,为ORA-01408:此列列表已索引。

请问这是为什么?如果要正确创建索引,应该怎么办?
初学者求助,望各路大神解答,感激不尽。

1、在计算机中,打开Oracle的连接程序,用新建的数据库管理员。

2、 接着,在【Oracle服务器】的窗口上,在输入窗口中输入SQL查询语句,并单击【执行】按钮,可以看到查询不到索引表,需要调整SQL语句。

3、然后,在【SQL工作表】的窗口上,输入查询索引表的SQL语句。

4、接着,在【SQL工作表】的窗口上,输查询索引表的SQL语句,并单击【执行】按钮。

5、 然后,在【SQL工作表】的窗口上,可以看到SQL语句执行成功的提示信息,查询到用户的索引表中的字段。

6、接着,在【SQL工作表】的窗口上,修改索引表的名称,并单击【执行】按钮,就完成了。

参考技术A 根据你建表的语句,确实不需要再创建索引,因为这两列被你设为主键,所以你再建索引会报错。
创建主键时数据库会创建同名的唯一索引,当然因为是主键的关系,所以和直接创建唯一索引还是有一点区别:作为主键这两列的值不允许为空追问

如果我非要根据这两列创建索引应该怎么做?移除主键再创建索引吗?语句应该怎么写?感谢!

追答

是的,因为同一列上不允许重复建索引,所以非要创建索引就只能移除主键。但是为什么要这样做?除非这两列的值可以为空。
Oracle 在创建主键时会隐式建立唯一索引。
若要手动创建索引,那就先移除主键约束,然后创建索引,再加上主键约束,这样也是可以的,主键会使用现有索引。也就是说,你先建唯一索引再加主键约束,和直接建主键是一个效果,一步完成的动作何必弄得那么麻烦呢?当然,先建索引再加主键的好处是索引名字可以自己定,强迫症福音,哈哈。以下是官方说明
PRIMARY KEY Constraints and Indexes
Oracle enforces all PRIMARY KEY constraints using indexes. the primary key constraint created for the deptno column is enforced by the implicit creation of:

A unique index on that column

A NOT NULL constraint for that column

Composite primary key constraints are limited to 32 columns, which is the same limitation imposed on composite indexes. The name of the index is the same as the name of the constraint. Also, you can specify the storage options for the index by including the ENABLE clause in the CREATE TABLE or ALTER TABLE statement used to create the constraint. If a usable index exists when a primary key constraint is created, then the primary key constraint uses that index rather than implicitly creating a new one.

本回答被提问者采纳
参考技术B primary key(studentNum,lessonNum),

你用这两个列创建了主键后,就已经创建了一个唯一索引了,你再用
create UNIQUE INDEX stu_choose_lesson_Ind
on stu_choose_lesson(studentNum,lessonNum);

创建惟一索引,当然会报错
参考技术C 因为已经创建了主键,已默认给建立了索引了。不需要再创建的。

求助oracle like%.%模糊查询优化

参考技术A 这种一般从业务逻辑上面优化比较好,比如把字段切割开开存,把模糊匹配变成精确匹配。 参考技术B 将%.%改为用instr函数实现。 参考技术C 建立查询字段的索引

以上是关于【求助】oracle中sql语句 此列列表已索引的解决办法的主要内容,如果未能解决你的问题,请参考以下文章

在oracle里,一个sql多表查询,单独执行能利用索引提高速率,但外层套上分页时,会全表扫描,如何解决,求助高手

oracle 用sql语句查询 已打补丁列表。

求助oracle like%.%模糊查询优化

在oracle中创建表,如何写sql语句才能保证表不重复创建,也就是说,如何让他不提示表或视图已存在

sql 代理创建一个新的作业 执行SISS包

oracle 中sql语句怎么加多个强制索引