MySQL和Oracle在索引名称唯一性方面的不同设计

Posted bisal(Chen Liu)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL和Oracle在索引名称唯一性方面的不同设计相关的知识,希望对你有一定的参考价值。

最近碰到要删除一个mysql数据库索引的需求,按照Oracle的思维,"drop index index_name"会提示错误,MySQL删除索引,有两种形式,

(1) 使用DROP INDEX语句

语法格式,

DROP INDEX <索引名> ON <表名>

语法说明如下,

  • <索引名>:要删除的索引名。

  • <表名>:指定该索引所在的表名。

(2) 使用ALTER TABLE语句

根据ALTER TABLE语句的语法可知,该语句可以用于删除索引。具体使用方法是将ALTER TABLE语句的语法中部分指定为以下子句中的某一项。

  • DROP PRIMARY KEY:表示删除表中的主键。一个表只有一个主键,主键也是一个索引。

  • DROP INDEX index_name:表示删除名称为 index_name 的索引。

  • DROP FOREIGN KEY fk_symbol:表示删除外键。

注意:如果删除的列是索引的组成部分,那么在删除该列时,也会将该列从索引中删除;如果组成索引的所有列都被删除,那么整个索引将被删除。

猜想一下,之所以在MySQL中不支持"drop index index_name"的操作,应该是说index_name不能唯一标识一个索引,很容易进行验证,在如下这两张表上各创建一个同名的索引,这是可行的,

root@mysqldb 14:41:  [test]> create table t1(id int);
Query OK, 0 rows affected (0.29 sec)


root@mysqldb 14:41:  [test]> create table t2(id int);
Query OK, 0 rows affected (0.06 sec)


root@mysqldb 14:41:  [test]> create index idx_t on t1(id);
Query OK, 0 rows affected (0.17 sec)
Records: 0  Duplicates: 0  Warnings: 0


root@mysqldb 14:41:  [test]> create index idx_t on t2(id);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

从数据字典可以看到,确实两张表,有相同名称索引,

root@mysqldb 14:50:  [test]> select t1.name index_name, t2.name table_name
    -> from information_schema.innodb_indexes t1, information_schema.innodb_tables t2
    -> where t1.table_id=t2.table_id and t1.name='idx_t';
+------------+------------+
| index_name | table_name |
+------------+------------+
| idx_t      | test/t1    |
| idx_t      | test/t2    |
+------------+------------+
2 rows in set (0.04 sec)

这说明了MySQL并不是通过索引名称唯一标识一个索引的,而在Oracle中,创建一个同名的索引,就会提示ORA-00955,

SQL> create index idx_01 on a(object_id);
create index idx_01 on a(object_id)
             *
ERROR at line 1:
ORA-00955: name is already used by an existing object

MySQL和Oracle在一些技术细节的设计上,还是存在差异。其实不只是这两种数据库,随着信创改造,我们接触的数据库可能越来越多,不同数据库之间的差异性,是我们日常工作中需要积累的财富。

近期更新的文章:

Linux环境监控工具基础参考

最近碰到的问题

GreatSQL配置到系统systemd服务

GreatSQL单机环境安装

推荐一款小游戏

文章分类和索引:

公众号900篇文章分类和索引

以上是关于MySQL和Oracle在索引名称唯一性方面的不同设计的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中索引名称的唯一性

mongodb 索引唯一性约束

在oracle数据库中普通索引和唯一索引,请问哪个效率更高?

MySQL数据库中的索引——索引的使用,最左前缀原则

存在唯一索引时,Oracle 10g 和 11g 之间 REF CURSOR 的行为不同?

MySQL InnoDB表创建联合唯一索引出错?