1约束标记CONSTRAINTsymbol
CONSTRAINTsymbol子句用于命名一个名为symbol的约束。如果没有使用该子句或在CONSTRAINT后没有加上symbol,MySQL会自动生成一个约束名(可能会发成异常)。如果使用了symbol,其值必须是在数据库唯一、在约束类型唯一,如果重复则会报错。注:在NDB中如果CONSTRAINTsymbol并不是出现在外键定义中或symbol未出现在CONSTRAINT关键字后面,NDB会使用外键索引的名称。
SQL标准指定所有类型的约束(包括:主键、唯一索引、外键、check)归属于同一个命名空间。在MySQL中,每一个约束类型在每个数据库中拥有命名空间,即对于每个数据库,每种类型的约束名必须是唯一的。
2主键PRIMARYKEY
唯一索引要求所有的列都定义为非空,如果这些列没有明确的声明为非空,MySQL会默认隐式地进行声明。一个表只能有一个主键。主键的名称通常叫做primary,这样就不会被用作成其他类型的索引的名称了。此处应该注意的是并不是说唯一键的索引列数据必须为非空,也可以插入空值,但是空值不会在索引中进行维护。
如果表中并没有主键,但是应用中需要表存在主键,MySQL会把第一个不含有NULL值的唯一索引当作主键。
对于InnoDb引擎的表,保持主键短小能最小化普通索引的存储开销,因为每一个普通索引都会包含该行对应的主键副本。
在CREATETABLE语句中,PRIMARYKEY被放置在最前,后续是所有的唯一索引,然后是非唯一索引,这样能使MySQL优化器优先选择利用哪个索引并且更快地位检测重复值。
主键可以是多列的组合,但是此时是不能在列声明时使用PRIMARYKEY进行指定的,这种方式只适合单列主键的指定,此时需要使用单独的指定语句,如下:
在MySQL中,主键的名称就是primary。对于其他索引,如果没有指定一个名称,索引会选用其第一个列的列名或列名加上后缀(_2,_3)来使其唯一,可以通过SHOWINDEXFROMtbl_name来查看索引信息,如下:
如上图主键索引名称为PRIMARY,第一个普通索引名称为name,第二个为gender,第三个索引是联合索引,采用其第一个列名加后缀命名为name_2,第四个索引是联合索引,采用其第一个列名加后缀命名为gender_2。
需要注意的是,如果主键为多列联合主键,那么任意一列中都不允许出现空值。
3KEY与INDEX
KEY与INDEX等效,表定义中在列定义时可以使用primarykey指定主键,也可以使用key指定主键,这样做的目的是为了与其他数据库兼容,如下SQL:
需要注意的时如果在列声明完毕后,另起行中使用key进行索引申明,生成的都是普通索引。
4唯一索引UNIQUE
唯一索引要求所有索引中维护的值必须是唯一的如果想表中插入的数据行中对应的唯一索引列值是重复的则会报错。所有的存储引擎都允许唯一索引出现多个NULL。如果在唯一索引中指定了列的前缀长度,那么前缀长度的值必须是唯一的。NULL值是不会被维护到唯一索引中的,如果一个唯一索引是联合索引,只要任意一个列出现NULL都不会被维护到唯一索引中。
5全文索引FULLTEXT
FULLTEXT索引是应用于全文检索的,只有InnoDb和MyIsam存储引擎支持全文索引,并且只能在CHAR、VARCHAR和TEXT类型的列上创建全文索引。全文索引必须设置在完整数据列上,使用列前缀方式设置时前缀长度会被忽略。全文索引可以用WITHPARSER子句来指定全文索引的解析插件,只有全文索引可以使用WITHPARSER。
6空间SPATIAL
可以在空间数据类型上添加空间索引,只有InnoDb和MyIsam表才支持控件索引,并且控件列不可为空。
7外键FOREIGNKEY
MySQL支持外键,可以达到跨表关联的目的,外键约束用于严格保持数据的一致性。InnoDb引擎下的分区表是不支持外键的。
8CHECK
所有的存储引擎都会解析CHECK子句,但是会忽略不执行。