1. primary key
表的主键,同时会建立索引。
mysql中每张table最多有一个primary key,也可以没有。primary key可以包含一个column,也可以包含多个column。当包含多个column时,这些column的组合必须在table中唯一。
2. unique key
唯一键,可以定义多个,也可以不定义。一个unique key可以包含一个column,也可以包含多个column。unique key对应列或列组合的值必须在表中唯一。
3. key
可以定义多个,也可以不定义。可以包含一个column或多个column,都可以有重复值。
information_schema.key_column_usage中可以查询每个table中primary key和unique key的constraint_name、column_name。如果包含多个column,ordinal_position记录每个column在key中的位置。
information_schema.columns可以查询每个table中各个column的信息,column_key表示该列的key属性,取值有PRI、UNI、MUL和空四种。PRI表示该列是单列主键或联合主键的一部分,UNI表示该列是单列unique key,MUL表示该列是联合unique key的第一列或联合key的第一列,或就是一个单列key。
information_schema.statistics可以查询所有key/index的信息,seq_in_index表示column_name在索引中的序号。
比如有如下table test
create table `test` (
`id` varchar(10) not null,
`name` varchar(10) not null,
`age` tinyint not null,
`staffNo` tinyint not null,
`dept` varchar(5) not null,
`team` varchar(5) default null,
`gender` varchar(5) not null,
`home` varchar(30) default null,
`zipcode` varchar(6) not null,
`company` varchar(10) not null,
key(`company`),
unique key(`zipcode`),
primary key(`name`,`age`, `id`),
unique key(`dept`,`staffNo`,`team`),
key (`gender`,`home`)
);
select COLUMN_NAME, COLUMN_KEY from information_schema.columns where table_schema='test' and table_name = 'test';
select CONSTRAINT_NAME, COLUMN_NAME, ORDINAL_POSITION from information_schema.key_column_usage where table_schema = 'test' and table_name='test';
SELECT non_unique, index_name, seq_in_index, column_name from information_schema.STATISTICS where TABLE_SCHEMA = 'test' and TABLE_NAME = 'test' order by INDEX_NAME, SEQ_IN_INDEX;