索引
大多以B-tree方式存储;
普通索引(index)
唯一性索引(unique):索引列的所有值都只能出现一次;
主键(primary key):每个表只能有一个
全文索引(fulltext):只能在varchar或text类型的列上创建,只能在myisam表中创建;
创建索引
1)create index
默认升序(asc);
create index xh_xs on xs(学号(5) asc);
根据xs表的学号列上的钱5个字符建立一个升序索引xh_xs;
create index xskc_in on xs_kc(学号,课程号);在xs_kc表的学号列和课程号列上建立一个复合索引
xskc_in;
2)
alter table xs add index xs_xm using btree(姓名);
alter table xs add primary key(学号),add index mark(性别);
show index from xs;
3)在创建表时创建索引
create table xs_kc1
(
学号 char(6) not null,
课程号 char(3) not null,
成绩 tinyint(1),
学分 tinyint(1),
primary key(学号,课程号),
index cj(成绩)
);
删除索引
drop index xs_xh on xs;
alter table xs drop primary key,drop index mark;
索引的弊端:
索引以文件形式存储,要占用磁盘空间;
表中索引很多时,会降低添加、删除、修改、和其他写入操作的效率;
数据完整性约束
1)主键约束
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null primary key,
出生日期 datetime
);
create table course
(
学号 varchar(6) not null,
姓名 varchar(8) not null,
毕业日期 date not null,
课程号 varchar(3),
学分 tinyint,
primary key(学号,课程号,毕业日期)
);
列的组合也可以充当主键
从一个复合主键中删除一列后,剩下的列构成主键仍然满足唯一性原则,那么这个复合主键是不正确的
,这条规则叫最小化规则;也就是说复合主键不应该包含一个不必要的列。
create table course1
(
学号 varchar(6) null,
姓名 varchar(8) not null,
毕业日期 datetime not null,
课程号 varchar(3),
学分 tinyint,
primary key index_course(学号,课程号,毕业日期)
);
2)替代建约束(unique)
替代建是没有被选做主键的候选键
create table xs2
(
学号 varchar(6) null,
姓名 varchar(8 ) not null unique,
出生日期 datetime null,
primary key(学号)
);
替代键也可以定义为表的完整性约束;
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8 ) not null,
出生日期 datetime null,
primary key(学号),
unique(姓名)
);
一个表中可以有若干个UNIQUE键,它们甚至可以重合;主键字段的值不允许为null????,unique可以
,但必须声明;
3)参照完整性约束
很多规则是和表之间的关系有关的,这种关系就是参照完整性约束,实现为一个外键。
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null,
出生日期 datetime null,
primary key(姓名),
foreign key(学号) references xs(学号)
)default charset=gb2312;
自参照完整性
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null,
出生日期 datetime null,
primary key(姓名),
foreign key(学号) references xs1(学号)
)default charset=gb2312;
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null,
出生日期 datetime null,
primary key(姓名),
foreign key(学号) references xs(学号) on update cascade
)default charset=gb2312;
这个参照动作的作用是在主表更新时,子表产生连锁更新动作。
create table student
(
学号 char(6) not null,
性别 char(1) not null check(性别 in('男','女'))
);
create table student1
(
学号 char(6) not null,
出生日期 date not null check(出生日期>'1980-01-01')
);
create table student2
(
学号 char(6) not null,
性别 char(1) not null check(性别 in(select 性别 from student))
);
create table student3
(
学号 char(6) not null,
最好成绩 int(1) not null,
平均成绩 int(1) not null,
check(最好成绩>平均成绩)
);
命名完整性约束
create table xs5
(
学号 varchar(6) null,
姓名 varchar(8) not null,
出生日期 datetime null constraint primary_key_xs1 primary key(姓名)
);
本例中给主键姓名分配了名字primary_key_xs1;
删除完整性约束
alter table xs drop primary key;
大多以B-tree方式存储;
普通索引(index)
唯一性索引(unique):索引列的所有值都只能出现一次;
主键(primary key):每个表只能有一个
全文索引(fulltext):只能在varchar或text类型的列上创建,只能在myisam表中创建;
创建索引
1)create index
默认升序(asc);
create index xh_xs on xs(学号(5) asc);
根据xs表的学号列上的钱5个字符建立一个升序索引xh_xs;
create index xskc_in on xs_kc(学号,课程号);在xs_kc表的学号列和课程号列上建立一个复合索引
xskc_in;
2)
alter table xs add index xs_xm using btree(姓名);
alter table xs add primary key(学号),add index mark(性别);
show index from xs;
3)在创建表时创建索引
create table xs_kc1
(
学号 char(6) not null,
课程号 char(3) not null,
成绩 tinyint(1),
学分 tinyint(1),
primary key(学号,课程号),
index cj(成绩)
);
删除索引
drop index xs_xh on xs;
alter table xs drop primary key,drop index mark;
索引的弊端:
索引以文件形式存储,要占用磁盘空间;
表中索引很多时,会降低添加、删除、修改、和其他写入操作的效率;
数据完整性约束
1)主键约束
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null primary key,
出生日期 datetime
);
create table course
(
学号 varchar(6) not null,
姓名 varchar(8) not null,
毕业日期 date not null,
课程号 varchar(3),
学分 tinyint,
primary key(学号,课程号,毕业日期)
);
列的组合也可以充当主键
从一个复合主键中删除一列后,剩下的列构成主键仍然满足唯一性原则,那么这个复合主键是不正确的
,这条规则叫最小化规则;也就是说复合主键不应该包含一个不必要的列。
create table course1
(
学号 varchar(6) null,
姓名 varchar(8) not null,
毕业日期 datetime not null,
课程号 varchar(3),
学分 tinyint,
primary key index_course(学号,课程号,毕业日期)
);
2)替代建约束(unique)
替代建是没有被选做主键的候选键
create table xs2
(
学号 varchar(6) null,
姓名 varchar(8 ) not null unique,
出生日期 datetime null,
primary key(学号)
);
替代键也可以定义为表的完整性约束;
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8 ) not null,
出生日期 datetime null,
primary key(学号),
unique(姓名)
);
一个表中可以有若干个UNIQUE键,它们甚至可以重合;主键字段的值不允许为null????,unique可以
,但必须声明;
3)参照完整性约束
很多规则是和表之间的关系有关的,这种关系就是参照完整性约束,实现为一个外键。
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null,
出生日期 datetime null,
primary key(姓名),
foreign key(学号) references xs(学号)
)default charset=gb2312;
自参照完整性
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null,
出生日期 datetime null,
primary key(姓名),
foreign key(学号) references xs1(学号)
)default charset=gb2312;
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null,
出生日期 datetime null,
primary key(姓名),
foreign key(学号) references xs(学号) on update cascade
)default charset=gb2312;
这个参照动作的作用是在主表更新时,子表产生连锁更新动作。
create table student
(
学号 char(6) not null,
性别 char(1) not null check(性别 in('男','女'))
);
create table student1
(
学号 char(6) not null,
出生日期 date not null check(出生日期>'1980-01-01')
);
create table student2
(
学号 char(6) not null,
性别 char(1) not null check(性别 in(select 性别 from student))
);
create table student3
(
学号 char(6) not null,
最好成绩 int(1) not null,
平均成绩 int(1) not null,
check(最好成绩>平均成绩)
);
命名完整性约束
create table xs5
(
学号 varchar(6) null,
姓名 varchar(8) not null,
出生日期 datetime null constraint primary_key_xs1 primary key(姓名)
);
本例中给主键姓名分配了名字primary_key_xs1;
删除完整性约束
alter table xs drop primary key;