暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

410

最近碰到要删除一个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篇文章分类和索引

          文章转载自bisal的个人杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论