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

£神魔★判官ぃ 2022-12-05 10:08 148阅读 0赞

文章目录

  • MYSQL开发-约束、自动增长、删除和清空表数据、索引、视图
      1. 五种数据库完整性约束
      1. 自动增长auto_increment
      1. delete和truncate
      1. 索引
      1. 视图

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

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

五大约束:主键约束、唯一约束、外键约束、非空约束、检查约束

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

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

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

  1. create table student(id int not null primary key,name char(20),grade int);
  2. 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表中对应的记录。

  1. -- 创建表后添加索引
  2. alter table table_name
  3. add constraint con_name
  4. foreign key(fk_col_name)
  5. references 外键表名(外键表对应字段)
  6. [on delete cascade] -- 级联删除
  7. [on update cascade] -- 级联更新
  8. ) [ENGINE=innodb]; -- 修改存储引擎为innodb
  9. -- 创建表时添加索引
  10. create table table_name(字段 数据类型...,
  11. [constraint con_name]
  12. foreign key(fk_col_name)
  13. references 外键表名(外键表对应字段)
  14. [on delete cascade]
  15. [on update cascade]
  16. ) [ENGINE=innodb];
  17. -- mysql5.7默认存储引擎就是innodb

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

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

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

在这里插入图片描述

2. 自动增长auto_increment

  1. -- auto_increment所在列必须是主键列
  2. create table student(
  3. id int not null auto_increment primary key,
  4. name char(20),
  5. 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值,加快查询速度。

  1. index关键字可以与key关键字等价替换。
  2. index [index_name](col_name)
  3. key [key_name](col_name)
  4. -- 创建表时建立索引
  5. -- index [index_name](col_name)
  6. -- index_name可以省略,此时字段名即索引名。
  7. create table test1(id int,name char(20),index(name));
  8. create table test1(id int,name char(20),index index_name(name));
  9. -- 创建完表后建立索引
  10. alter table 表名 add index index_name(col_name);

在这里插入图片描述

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

  1. -- unique index index_name(col_name)
  2. -- 创建表时建立索引
  3. create table test2(id int,name char(20), unique index(id));
  4. -- 创建完表后建立索引
  5. alter table test2 add unique index(id);

在这里插入图片描述

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

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

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

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

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

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

  1. -- fulltext index index_name(col_name)
  2. -- 全文索引所在列的数据类型只能是varchartest类型。
  3. -- 创建表时建立索引
  4. create table test6(id int primary key,name varchar(50),fulltext index(name));
  5. -- 创建完表后建立索引
  6. create table test7(id int primary key,name varchar(50));
  7. 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
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,148人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mysql全部数据

       之前测试1千万数据插入MySQL数据库里面,分别使用单线程的方式和线程池的方式对比测试,查看效果,但是插入了1千万数据后,由于是测试数据,现在不能在新建一张表浪费存储空间

    相关 mysql 数据

      我一直在阅读有关pandas数据框中的分层索引和多索引的信息,但似乎这些都是针对有序标签的.例如,我的数据如下所示:我希望能够根据列标签将数据分组在一起.通过平均将第3行中

    相关 删除mysql

      为某基于wordpress搭建的博客长久未除草,某天升级的时候发现已经被插入了几万条垃圾留言,如果一条条删除那可真是累人的活。遂考虑直接进入mysql直接清空表或者删除表中