目录
索引与键的增删改
主键
主键会自动添加唯一索引,所以主键列不需要添加索引
建表时设置主键
方法1、
create table student(
id int primary key
);
方法2、
create table student(
id int,
primary key (id)
);
单独设置主键
alter table student add primary key(id)
删除主键
alter table student drop primary key;
外键
外键是指引用另外一个表中的一列或多列数据,被引用的列应该具有主键约束或者唯一性约束(简单来说外键是另一个表的主键或者唯一约束)。外键可以有重复的, 可以是空值,用来建立和加强两个表数据之间的连接
外键的使用
外键的使用需要满足下列的条件:
1、两张表必须都是InnoDB表,并且它们没有临时表。
2、建立外键关系的对应列必须具有相似的InnoDB内部数据类型。
3、建立外键关系的对应列必须建立了索引。
创建外键的两种方式:
方式一:在创建表的时候进行添加
方式二:表已经创建好了,继续修改表的结构来添加外键。
建表时添加外键
方法1、
create table teacher(
student_id int not null,
foreign key(student_id) references student(id)
);
alter table teacher add constraint teacher_ref_student(foreignKeyName)
foreign key(student_id) references student(id);
方法2、
表1
create table student(
id int primary key, --学生的学号
)comment '学生表';
表2
create table score(
studentID int,
coureseID int,
scoreID int primary key,
foreign key(studentID) references student(id) --添加外键
)comment '成绩表'
单独添加外键
语法:alter table 表名称 add foreign key (列名称) references关联表名称(列名称);
eg1:
alter table teacher add constraint teacher_ref_student(foreignKeyName)
foreign key(student_id) references student(id);
eg2:
alter table student add foreign key (id) references score(studentID);
删除外键
语法:alter table 表名称 drop foreign key 外键名称;
eg1:
alter table score drop foreign key score_1;
eg2:
alter table tableName1 drop foreign key foreignKeyName;
唯一键
唯一键会自动添加唯一索引,所以唯一键列不需要添加索引
普通索引
创建一张表
create table member(id int(10) ,name varchar(10) ,age int(18) ,phone int(11) ,address varchar(50),);
insert into member values (1,'a','19','111','赣州');
insert into member values (2,'b','24','222','于都');
insert into member values (3,'c','20','333','九江');
insert into member values (4,'d','18','444','南昌');
insert into member values (5,'e','16','555','吉安');
方法一:直接创建索引
CREATE INDEX 索引名 ON 表名 (列名(length));
- (列名(length)):length是可选项,下同。如果忽略length 的值,则使用整个列的值作为索引。如果指定,使用列的前length个字符来创建索引,这样有利于减小索引文件的大小。在不损失精确性的情况下,长度越短越好。
- 索引名建议以“index"结尾。
create index name_index on member(name); 以name字段创建普通索引
create index cardid_index on member(cardid(4)); 指定cardid字段值的前4个字符做普通索引的值
方法二:修改表方式创建索引
ALTER TABLE 表名 ADD INDEX 索引名(列名);
ALTER TABLE member ADD INDEX phone_index(phone); 以phone字段创建普通索引
方法三:创建表时指定索引
一般不在创建表的时候添加索引,会让插入数据变慢。
-
CREATE TABLE 表名(字段1数据类型,字段2数据类型[,...],INDEX 索引名 (列名));
create table member(id int(10) ,name varchar(10) ,cardid int(18), phone int(11) ,address varchar(50),
INDEX name_index(name));
删除索引:
drop index name_index on member; --直接删除索引
drop index cardid_index on member; --直接删除索引
alter table member DROP index phone_index; --以修改表的方式删除索引
唯一索引(创建唯一键即创建唯一索引)
唯一索引:与普通索引类似,但区别是唯一索引列的每个值都唯一。 唯一索引 允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。
创建唯一键或者创建唯一索引都可实现。
方法一:直接创建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(字段名);
create unique index address_index on member (address);
方法二:以修改表的方式创建
ALTER TABLE 表名 ADD UNIQUE 索引名(字段名);
alter table member add unique phone_index(phone);
方法三:创建表时指定索引
CREATE TABLE 表名(字段1 数据类型,字段2 数据类型[...],UNIQUE 索引名(字段名));
create table member(id int(10) ,name varchar(10) ,cardid int(18) ,phone int(11) ,address varchar(50),unique phone_index(phone));
主键索引(和创建主键的方式一样)
主键索引是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。
方法一:创建表时添加主键
create table 表名(字段1 XXX, 字段2 XXX, ...primary key(字段));
create table 表名(字段1 XXX primary key, ...); 将主键作为字段1的属性
create table student(id int(10),name varchar(10),primary key(id));
create table student(id int(10) primary key,name varchar(10));
方法二:在现有表中添加主键
ALTER TABLE 表名 add primary key(字段名);
ALTER TABLE member add primary key(id); --将id字段添加为主键
组合索引(单列索引与多列索引)
组合索引(单列索引与多列索引):可以是单列上创建的索引,也可以是在多列上创建的索引。
需要满足最左原则,因为select 语句的where条件是依次从左往右执行的,所以在使用select 语句查询时where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。
方法一:直接创建索引
CREATE INDEX 索引名 on 表名(字段1,字段2,字段3);
create index name_cardid_phone_index on member3(name,cardid,phone); 使用3个字段创建组合索引
alter table member3 drop index name_cardid_phone_index; 删除组合索引
遵循最左原则
方法二:修改表的方式创建索引
alter table 表名 add index 索引名(字段1,字段2, ..., 字段n);
alter table member add index phone_name_cardid_index(phone,name,cardid);
方法三:创建表的时候指定索引
CREATE TABLE 表名(列名1 数据类型,列名2 数据类型,列名3 数据类型, INDEX 索引名(字段1,字段2,字段3));
create table member(id int(10),name varchar(10),phone int(11),index name_phone_index(name,phone));