MYSQL开发-五大约束、自动增长、删除和清空表数据、索引、视图

MYSQL开发-约束、自动增长、删除和清空表数据、索引、视图

1. 五种数据库完整性约束

①非空约束(not null):列值不能为NULL,但可以是空字符串’’

  1. 字段默认允许null,这时需要额外存储空间来记录字段值是否为null,而若是字段约束为not null,则字段值不可能为null,故无需额外存储空间,所以not null的效率比null高。
  2. 空字符串’’ 和NULL的区别:
    列可为null,会分配额外空间为每个NULL值做标记。若列值为空字符串’’,则空字符串’'是不占空间的。若列值为NULL,则需要在额外空间中记录这个值是NULL,故需要占用空间。
    在这里插入图片描述
    在这里插入图片描述

②主键约束(primary key):列值唯一,且不能为NULL

create table student(id int not null primary key,name char(20),grade int);
desc student;

在这里插入图片描述
③检查约束(check):控制插入值的范围。在mysql中一般不适用。
在mysql中,输入值的范围较小,如男、女。可以使用枚举类型enum()来限制。输入值的范围较大,如a>0,可以使用触发器来控制。这里仅使用枚举类型举例。
在这里插入图片描述
这里使用了default character set utf8语句,即使用utf8编码方式。若不使用,会有如下报错:
在这里插入图片描述
在创建表后使用枚举型字段:
在这里插入图片描述

④外键约束(foreign key)
创建测试数据:
在这里插入图片描述
在这里插入图片描述
可以看到,测试数据有emp表和dept表。其中emp.deptno和dept.id都是部门编号。
外键约束也是为了保护数据的完整性。
①当在emp表中插入一条deptno为30的记录,但在dept表中无法找到该部门的信息,这时数据是不完整的。
②当在dept表中删除id=10的记录,也会导致emp表中deptno=10的员工找不到对应的部门信息,这时数据也是不完整的。

在emp表上的deptno字段加上外键约束,可以保证数据的完整性。不允许在emp中插入deptno不属于dept的记录。若删除dept中的数据,也会同步删除emp表中对应的记录。

-- 创建表后添加索引
alter table table_name
add constraint con_name 
foreign key(fk_col_name) 
references 外键表名(外键表对应字段)
[on delete cascade]   -- 级联删除
[on update cascade]   -- 级联更新
) [ENGINE=innodb];    -- 修改存储引擎为innodb

-- 创建表时添加索引
create table table_name(字段 数据类型...,
[constraint con_name]
foreign key(fk_col_name) 
references 外键表名(外键表对应字段)
[on delete cascade]
[on update cascade]
) [ENGINE=innodb];

-- mysql5.7默认存储引擎就是innodb

创建表后添加外键约束:
在这里插入图片描述
测试级联删除:
在这里插入图片描述
查看建表语句的外键约束:
在这里插入图片描述
创建表时添加外键约束:
先创建外键表,再创建有外键约束的表(引用表)。

在这里插入图片描述
在这里插入图片描述
先删除引用表,再删除外键表。
在这里插入图片描述
删除外键约束:
在这里插入图片描述
外键列(emp.deptno)的值有一个规定:可以为NULL,但是不可以不存在。
⑤默认约束(default)

-- 创建一个表,当插入的某条记录的字段grade未指定值时,为字段grade指定默认值
create table student(id int not null primary key,name char(20),grade int default 0);
INSERT INTO student(id,NAME) VALUES(1,'haha');    -- grade默认填充0
select * from student;

在这里插入图片描述

2. 自动增长auto_increment

-- auto_increment所在列必须是主键列
create table student(
id int not null auto_increment primary key,
name char(20),
grade int default 0);

测试id自动增长,可以看到ID是从1开始的。

在这里插入图片描述
如果当前id最大值为5,那么自动增长的下一个id会是6。【即当前最大ID+1
在这里插入图片描述

3. delete和truncate

id列为auto_increment自动增长。现在的值为6。
在这里插入图片描述
在这里插入图片描述
delete语句仅删除数据,不重置auto_increment的值为1。可以看到新的id的值为7。
在这里插入图片描述
在这里插入图片描述
truncate不仅会清空数据,还会重置auto_increment的值为1。
在这里插入图片描述

4. 索引

索引是一种特殊的文件,包含对数据表里所有记录的引用指针,可以看作是目录,目的是为了加快数据库的查询速度
缺点:
索引是以文件存储的,索引过多,占用磁盘空间较大,同时会影响insert、update、delete的执行时间。
索引中数据与数据表数据必须同步,索引过多,当表中数据更新时,索引也要同步更新,这就降低了效率。

索引类型:
①普通索引:字段值可以不唯一,即可以重复,允许有NULL值,加快查询速度。

index关键字可以与key关键字等价替换。
index [index_name](col_name)
key [key_name](col_name)

-- 创建表时建立索引
-- index [index_name](col_name)
-- index_name可以省略,此时字段名即索引名。
create table test1(id int,name char(20),index(name));
create table test1(id int,name char(20),index index_name(name));

-- 创建完表后建立索引
alter table 表名 add index index_name(col_name);

在这里插入图片描述

②唯一性索引:字段值必须唯一,只能出现一次,但允许有NULL值。

-- unique index index_name(col_name)
-- 创建表时建立索引
create table test2(id int,name char(20), unique index(id));

-- 创建完表后建立索引
alter table test2 add unique index(id);

在这里插入图片描述

③主键索引:主键索引即规定哪个字段为主键列,字段值非空且唯一。

-- 创建表时建立索引
create table test3(id int,name char(20), primary key(id));

-- 创建完表后建立主键索引,生产环境中不推荐,在数据库设计的时候就应该指定主键列。
create table test4(id int,name char(20));
alter table test4 add primary key index_id(id);

在这里插入图片描述
在这里插入图片描述
查看某个表上的索引情况:
在这里插入图片描述
④复合索引:索引不仅可以建立在一列上,还能建立在两列甚至多列上,这种索引称之为复合索引。

-- 在ip和port上创建复合主键索引
create table test5(ip char(50),port char(10),hostname char(50),primary key(ip,port));

在这里插入图片描述
在这里插入图片描述

⑤全文索引:为解决数据量大的情况下进行全表扫描,造成数据库压力较大的问题,mysql中提供了一种解决方案,即全文索引。使得模糊查询可以不进行全表扫描,而是通过全文索引查询。

-- fulltext index index_name(col_name)
-- 全文索引所在列的数据类型只能是varchar和test类型。
-- 创建表时建立索引
create table test6(id int primary key,name varchar(50),fulltext index(name));

-- 创建完表后建立索引
create table test7(id int primary key,name varchar(50));
alter table test7 add fulltext index index_name(name);

在这里插入图片描述
在这里插入图片描述
MySQL自带的全文索引只能用于数据库引擎为MyISAM的数据表,如果是其他数据引擎, 则全文索引不会生效,一般交给第三方软件进行全文索引。

总结:索引的最主要目的是为了加快查询速度,在数据表不频繁更新且数据量较大时建立索引,能最大限度的提高数据库的查询效率。

建立索引的规则: 【可以参考汉语字典的目录设置】
①限制索引的数目
②为常作为查询条件的字段建立索引
③为经常需要排序、分组和联合操作的字段建立索引
④选择唯一性索引
⑤尽量使用数据量少的索引
⑥删除不再使用或者很少使用的索引
⑦尽量使用前缀来索引
⑧索引列不能参与计算
⑨尽量的扩展索引,不要新建索引。

5. 视图

创建视图create view view_name as select查询
视图创建后,和基本表一样进行访问即可。
在这里插入图片描述
在这里插入图片描述
修改视图: alter view view_name as select查询
在这里插入图片描述
删除视图drop view view_name
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/108495294