vlambda博客
学习文章列表

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



近期更新的文章:

《》

《》

《》

《》

《》


文章分类和索引: