面向考试数据库系列博客以笔者的思维脑图为主线,博文内容为笔者对导图的具体分支所作的详细阐述,本篇博文,主要内容为索引与数据完整性其中不足,望读者多加指正。
引言
不知不觉,数据库的网课已经学到了索引的部分,赶紧总结,汇总成这篇博文笔记,不足之处,望多加指正。
索引知识点
索引在数据库中的存在就好像书中的目录一样,存在的优点就是让“读者”可以更快更方便的找到想要的内容,但是存在其并不是多多益善的,就像书,如果把它的所有图、表、公式、生僻字……目录都在书中安排,那这个目录未免显得太过于冗长。
索引分类
- 普通索引(index)
没有唯一性限制 - 唯一性索引(unique)
有唯一性限制。 - 主键(primary key)
具有唯一性,每个表只有一个 - 全文索引(fulltext)
只能在varchar或text类型的列上创建,并且只能在myisam表中创建
索引创建
- 通过create语句形式创建
CREATE [UNIQUE | FULLTEXT] INDEX 索引名
ON 表名(列名[(length)] [ASC | DESC],...)
- 通过Alter语句创建
使用ALTER TABLE语句
使用ALTER TABLE语句修改表,其中也包括向表中添加索引。
语法格式如下:
ALTER TABLE 表名
ADD INDEX [索引名] (列名,...) /*添加索引*/
| ADD PRIMARY KEY [索引方式] (列名,...) /*添加主键*/
| ADD UNIQUE [索引名] (列名,...) /*添加唯一性索引*/
| ADD FULLTEXT [索引名] (列名,...) /*添加全文索引*/
- 在建表的同时创建
建表时建索引
语法格式:
CREATE TABLE 表名 ( 列名, ... | [索引项])
其中,索引项语法格式如下:
PRIMARY KEY (列名,...) /*主键*/
| {INDEX | KEY} [索引名] (列名,...) /*索引*/
| UNIQUE [INDEX] [索引名] (列名,...) /*唯一性索引*/
| [FULLTEXT] [INDEX] [索引名] (列名,...) /*全文索引*/
索引删除
- 通过drop语句
语法格式:
DROP INDEX索引名 ON 表名
- 通过ALTER语句
- 使用ALTER TABLE语句删除索引
语法格式:
ALTER [IGNORE] TABLE 表名
| DROP PRIMARY KEY /*删除主键*/
| DROP INDEX 索引名 /*删除索引*/
索引对查询的影响
提高查询的速度,但是索引太多会降低数据增删改的速率
数据完整性约束知识点
- 主键约束
表中的一列或多个列的一组,其值能唯一地标志表中的每一行,不为空,在MySQL中主键唯一或没有。 - 替代建约束
性质与主键一样,是没有作为主键的候补键(unique) - 参照完整性约束
利用外键实现的完整性约束目前只能用在InnoDB储存引擎中 - check完整性约束
一些专用的约束(如月份、性别)
易混淆
主键、唯一性索引、唯一键区别
(1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除;
(2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空;
(3)相同字段序列不允许重复创建索引;
练习
主要来之上课的实验指导的习题部分,练习作业做出省略。
(1)在列级定义主码
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20));
(2)在表级定义主码
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno)
);
[例2]将SC表中的Sno,Cno属性组定义为码
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno) /*只能在表级定义主码*/
);
[例3] 定义SC中的参照完整性
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno), /*在表级定义实体完整性*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/*在表级定义参照完整性*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/*在表级定义参照完整性*/
);
[例4] 显式说明参照完整性的违约处理示例
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno)
ON DELETE CASCADE /*级联删除SC表中相应的元组*/
ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
/*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
ON UPDATE CASCADE
/*当更新course表中的cno时,级联更新SC表中相应的元组*/
);
[例10] 建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
CREATE TABLE Studenttt
(Sno NUMERIC(6),
CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
Sname varCHAR(20) not null,
Sage NUMERIC(3),
CONSTRAINT C3 CHECK (Sage < 30),
Ssex CHAR(2),
CONSTRAINT C4 CHECK (Ssex IN ( '男','女')),
CONSTRAINT StudentKey PRIMARY KEY(Sno)
)
在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4四个列级约束。
[例13] 修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40
可以先删除原来的约束条件,再增加新的约束条件
ALTER TABLE Student
DROP CONSTRAINT C1;
ALTER TABLE Student
ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999),
ALTER TABLE Student
DROP CONSTRAINT C3;
ALTER TABLE Student
ADD CONSTRAINT C3 CHECK (Sage < 40);
总结
该处知识主要浮与理论,相关实践做的不够多,仍需要加强练习。