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的这个相关问题下的更多证据。
#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);
评论
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