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

http://dev.mysql.com/doc/refman/5.5/en/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标准?

#1 楼

我认为SQL标准根本​​没有定义如何创建索引。

维基百科页面上的引文:


标准化

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


Postgres手册似乎在此支持:


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


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

评论


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

– a_horse_with_no_name
13年7月18日在21:25

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

–迈克·珀塞尔(Mike Purcell)
13年7月19日在6:31



#2 楼

如果您没有为索引提供名称,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);