1.普通索引。
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
(1)创建索引:create index indexname on tablename(tablecolumns(length));如果是char,varchar类型,length可以小于字段实际长度;如果是blob 和 text 类型,必须指定length,下同。
(2)修改表结构:alter tablename add index [indexname] on (tablecolumns(length))
(3)创建表的时候直接指定:create table tablename ( [...], index [indexname] (tablecolumns(length)) ;
2.唯一索引。
它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
(1)创建索引:create unique index indexname on tablename(tablecolumns(length))
(2)修改表结构:alter tablename add unique [indexname] on (tablecolumns(length))
(3)创建表的时候直接指定:create table tablename ( [...], unique [indexname] (tablecolumns(length))
查看索引 show index from 数据库表名
alter table 表名 add index 索引名称(数据库字段名称)
primary key(主键索引)
alter table table_name
add primary key ( column
)
unique(唯一索引)
alter table table_name
add unique (column
)
index(普通索引)
alter table table_name
add index index_name ( column
)
fulltext(全文索引)
alter table table_name
add fulltext ( col
)
多列索引
alter table table_name
add index index_name ( column1
, column2
)
-- 创建约束
alter table table_name
add unique(col
);
默认该约束的名称等于该列的名称,但是如果修改了这列的名称,而约束的名称确是不会改变的,这样在修改的时候容易引起问题,最好的方法是查看该表的约束再进行操作。
alter table table_name
add constraint index_name2 unique(col
);
create unique index index_name2 on table_name(col);
-- 删除没有显式命名的约束
show index from table_name; --查看 key_name 。如key_name 是 index_name
alter table table_name drop index index_name; -- 隐式
-- 删除带显式命名的约束
alter table table_name drop index index_name2; -- 显式
alter table table_name drop primary key; 直接就可以删除该表中的主键
show keys from table_name;
alter table table_name add constraint forkey_name foreign key (col) references table_name2(col);
或:
alter table table_name add foreign key (col) references table_name2(col);
(需要通过 show create table table_name)来查看外键名称
如果table_name2上没有主键约束和唯一性约束的列是没有资格作为列建立外键约束,否则会报错:“error 1215 (hy000): cannot add foreign key constraint”
alter table table_name2 add primary key (col);
删除外键:
首先查看外键名称:
show create table table_name
alter table table_name drop foreign key forkey_name;
check约束
建立约束alter table table_name add check(sex in ('男','女'));没有报错
但是insert into table_name values("a"); 不会报错,这是因为mysql 对于check会进行解析,但check约束实际无效。而要实际实现check约束的功能一般使用enum类型或者触发器来实现。