创建索引与更改表添加索引-MySQLism还是SQL Standard?


28

刚遇到一个奇怪的问题,根据我创建索引的方式,需要一个索引名称。

http://dev.mysql.com/doc/refman/5.5/zh-CN/create-index.html

http://dev.mysql.com/doc/refman/5.5/en/alter-table.html

CREATE INDEX `random_name` ON `my_table` (`my_column`); # Requires an index name

ALTER TABLE `my_table` ADD INDEX (`my_column`); # Does not require an index name

在我看来,CREATE INDEX调用不应使索引名称成为必需。我想知道这是MySQLism还是SQL标准?

Answers:


25

我不认为SQL标准定义了如何创建索引的所有

此维基百科页面的引文:

标准化

没有创建索引的标准,因为ISO SQL标准未涵盖物理方面。索引是数据库概念的物理部分之一,例如存储(表空间或文件组)。RDBMS供应商都提供了CREATE INDEX语法以及一些特定选项,具体取决于他们提供给客户的功能。

Postgres手册似乎在这里支持:

SQL标准中没有索引的规定。

在有关SO的这个相关问题下有更多证据。


6
MySQL是我所知道的唯一允许使用添加显式索引的DBMS ALTER TABLE(在某些情况下,各种DBMS将创建隐式索引来支持约束,但这不是我的意思)。
a_horse_with_no_name

@a_horse_with_no_name:正确记录。我不明白为什么MySQL强迫我们传递index_name,但显然它不能在下面处理任何名称。只是为了避免命名索引而被迫进行更改是PITA。
Mike Purcell 2013年

-1

如果您没有为索引提供名称,MySQL将自动为您命名索引。

ALTER TABLE my_table ADD INDEX (col1);
ALTER TABLE my_table ADD INDEX (col1, col2);
ALTER TABLE my_table ADD INDEX (col2);

SHOW INDEX FROM my_table;

ALTER TABLE ADD INDEX上面的语句将产生以下索引:

  • col1
  • col1_2
  • col2

如果创建的索引只有一列,则不必提供索引名称(因为索引名称将与列名称相同)。但是,如果您创建具有多个列的索引,则最好为索引提供一个名称,以便于识别索引。

优良作法是为索引提供一个名称(并idx在其前面加上或将其标识为索引的名称):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

-- or
CREATE INDEX idx_my_column ON my_table (my_column);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.