5.2.2 索引的创建
索引的创建有三种方法,分别是创建表时直接添加索引、使用create index语句在现有表中添加索引,使用alter table语句创建索引。
1.创建表时直接创建索引
要想使用create table语句在创建表时为新表创建索引,需在定义表列的语句部分指定索引创建子句,如下所示:
语法说明:索引名对于index和unique都是可选的,如果未给出,MySQL将为其选一个。另外,这里key是index的一个别名,具有相同的意义。
有一种特殊情形:可在列定义之后增加primary key创建一个单列的primary key索引,如下所示。
该语句等价于以下的语句:
前面所有表创建样例都对索引列指定了not null。如果是ISAM表,这是必需的,因为不能对可能包含null值的列进行索引。如果是MyISAM表,索引列可以为null,只要该索引不是primary key索引即可。
在某些情况下,可能会发现必须对列的前缀进行索引。例如,索引行的长度有一个最大上限,因此,如果索引列的长度超过了这个上限,那么就可能需要利用前缀进行索引。在MyISAM表索引中,对blob或text列也需要前缀索引。
对一个列的前缀进行索引限制了以后对该列的更改;不能在不删除该索引并使用较短前缀的情况下,将该列缩短为一个长度小于索引所用前缀的长度的列。
2.使用create index语句在现有表上创建索引
语法说明:
unique:创建唯一类型索引。
fulltext:创建全文索引。
索引名:索引名在同一个表中必须唯一。
表名:建立索引的数据表。
字段名:创建索引的列名。
长度:对于char和varchar列,只用一列的一部分就可创建索引。创建索引时,使用col_name(length)语法对前缀编制索引。前缀包括每列值的前length个字符。blob和text列也可以编制索引,但是必须给出前缀长度。
asc|desc:规定索引排序规则是升序(asc)还是降序(desc),默认为升序。
【例5.5】在empMIS数据库的员工表姓名列前2个字符上创建一个升序索引。
执行例5.5前表中索引:
执行例5.5后表中索引:
【例5.6】在empMIS数据库的员工表的员工编号和员工直属领导编号上建立一个复合索引。
代码如下:
执行例5.6后表中索引:
3.用alter table语句创建索引
为了给现有的表增加一个索引,可使用alter table来创建普通索引、unique索引或primary key索引,创建语法如下:
语法说明:
表名:要增加索引的表名。
数据列列表:指出对哪些列进行索引。一个(col1,col2,…)形式的列表创造一个多列索引。索引值由给定列的值串联而成。如果索引由不止一列组成,各字段名之间用逗号分隔。
索引名:是可选的,MySQL将根据第一个索引列赋给它一个名称。
alter table允许在单个语句中指定多个字段的更改,因此可以同时创建多个索引。
同样,也可以用alter table语句删除列的索引:
注意,上面第一条语句可以用来删除各种类型的索引,而第二条语句只在删除primary key索引时使用;在此情形中,不需要索引名,因为一个表只可能具有一个这样的索引。如果没有明确地创建作为primary key的索引,但该表具有一个或多个unique索引,则MySQL将删除这些unique索引中的第一个。
如果从表中删除了列,则索引可能会受到影响。如果所删除的列为索引的组成部分,则该列也会从索引中删除。如果组成索引的所有列都被删除,则整个索引将被删除。
【例5.7】连接stuMIS数据库,为department表departname添加唯一索引,以加速表的检索速度。
代码如下: