MySQL学习笔记(三)

1、insert插入多条数据

语法:insert into t_user(字段名1,字段名2...) values(值1,值2...),(值1,值2...),(值1,值2...)...;

2、快速创建表

原理:将一个查询结果当做一张表创建,可以完成表的快速复制。表创建出来,同时表中的数据也存在

3、将查询结果插入到一张表当中

4、快速删除表中的数据

delete语句删除数据的原理:表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放。缺点是删除效率比较低,优点是支持回滚,可以恢复数据

truncate语句删除数据的原理:删除效率比较高,表被一次截断,物理删除。缺点是不支持回滚,优点是快速。

如果大表非常大,使用delete也许需要执行1个小时才能删除完,效率比较低,可以选择truncate删除表中的数据,只需要不到1秒钟的时间

5、对表结构的增删改

在实际开发中,需求一旦确定后,表一旦设计好后,很少进行表结构的修改。开发进行中,修改表的结构,成本比较高。不需要掌握,可以使用工具。

6、约束

(1)在创建表的时候,可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性

(2)约束包括:

  • 非空约束:not null
  • 唯一性约束:unique
  • 主键约束:primary key 简称PK
  • 外键约束:foreign key 简称FK
  • 检查约束:check(mysql不支持,oracle支持)

(3)非空约束

约束的字段不能为null

not null只有列级约束

(4)唯一性约束

约束的字段不能重复,但是可以为NULL

新需求:name和email两个字段联合起来具有唯一性

create table t_vip(id int,name varchar(255) unique,email varchar(255) unique); // 列级约束

这样创建不符合以上的新需求,这样创建表示name具有唯一性,email具有唯一性,各自唯一

unique和null联合:在mysql中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段

(5)主键约束

主键约束的相关术语:

  • 主键约束
  • 主键字段
  • 主键值:是每一行记录的唯一标识,是每一行记录的身份证号

任何一张表都应该有主键,没有主键表无效

主键的特征:not null + unique(主键值不能是NULL,同时也不能重复)

可以使用表级约束:一个字段做主键叫单一主键,多个字段联合起来叫复合主键。在实际开发中不建议使用复合主键,因为主键值存在的意义就是这行记录的身份证号,只要意义达到即可,单一主键就可以做到,复合主键比较复杂,不建议使用。

一个表中的主键约束只能添加一个(主键只能有1个),主键值建议使用int、bigint、char等类型,不建议使用varchar来做主键。主键值一般都是数字,一般都是定长的。

主键除了单一主键和复合主键之外,还可以分类为:

  • 自然主键:主键值是一个自然数,和业务没关系
  • 业务主键:主键值和业务紧密关联,例如拿银行卡号做主键值

在实际开发中自然主键使用比较多,因为主键只需要做到不重复就行,不需要有意义,主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以业务主键不建议使用。

在mysql中,有一种机制,可以帮助我们自动维护一个主键值:

(6)外键约束

外键约束的相关术语:

  • 外键约束
  • 外键字段
  • 外键值

业务背景:请设计数据库表,来描述班级和学生的信息

第一种方案:班级和学生存储在一张表中,缺点数据冗余,空间浪费

第二种方案:班级一张表,学生一张表

t_class:classno(PK)、classname

t_student:no(PK)、name、cno

cno字段没有任何约束时,可能会导致数据无效。给cno字段添加外键约束,cno字段就是外键字段

注意:t_class是父表,t_student是子表。删除表的顺序,先删子再删父;创建表的顺序,先创建父再创建子;删除数据的顺序,先删子再删父,插入数据的顺序,先创建父再创建子。

子表中的外键引用父表中的某个字段,被引用的这个字段不一定是主键,但至少有唯一性unique

外键值可以为NULL

7、存储引擎(了解)

(1)存储引擎是mysql中特有的术语,存储引擎是一个表存储/组织数据的方式,不同的存储引擎,表存储数据的方式不同

(2)如何给表添加/指定"存储引擎":可以在建表时给表指定存储引擎

mysql默认的存储引擎是:InooDB

mysql默认的字符编码方式是:utf8

(3)查看mysql支持的存储引擎:九大存储引擎

(4)mysql常用的存储引擎:

  • MyISAM存储引擎:它管理的表具有的特征是使用三个文件表示每个表,可被转换为压缩、只读来节省空间,不支持事务机制,安全性低
    • 格式文件:存储表结构的定义(mytable.frm)
    • 数据文件:存储表行的内容(mytable.MYD)
    • 索引文件:存储表上索引(mytable.MYI)

索引可以缩小扫描范围,提高查询效率的一种机制。对于一张表来说,只要是主键,或者加有unique约束的字段会自动创建索引

  • InnoDB存储引擎:InnoDB支持事物,支持数据库崩溃后的自动恢复机制。最主要的特点是安全。效率不是很高,并且也不能压缩,不能转换为只读,不能很好的节省存储空间。它管理的表具有下列主要特征:
    • 每个InnoDB表在数据库目录中以.frm格式文件表示
    • InnoDB表空间tablespace被用于存储表的内容(表空间是一个逻辑名称)
    • 提供一组用来记录事物性活动的日志文件
    • 用COMMIT(提交)、SAVEPOINT及ROLLBACK(回滚)支持事务处理
    • 提供全ACID兼容
    • 在MySQL服务器崩溃后提供自动恢复
    • 多版本(MVCC)和行级锁定
    • 支持外键及引用的完整性,包括级联删除和更新
  • MEMORY 存储引擎:使用MEMORY存储引擎的表,其数据存储在内存中,且行的长度固定,这两个特点使MEMORY存储引擎非常快。优点是查询效率是最高的,缺点是不安全,关机之后数据消失(因为数据和索引都是在内存当中)。MEMORY存储引擎管理的表具有下列特征:
    • 在数据库目录内,每个表均以.frm格式的文件表示
    • 表数据及索引被存储在内存中(目的是查询快)
    • 表级锁机制
    • 不能包含TEXT或BLOB字段

8、事务

(1)一个事务就是一个完整的业务逻辑。例如转账,从A账户像B账户中转账10000。将A账户的钱减去10000(update语句),将B账户的钱加上10000(update语句),这就是一个完整的业务逻辑。以上的操作是一个最小的工作单元,要么同时成功或者同时失败。本质上事务就是多条DML语句同时成功或者同时失败。

(2)只有DML语句(insert、delete、update)才会有事务这一说,其他语句和事务无关。因为只有DML语句是数据库表中数据进行增删改的,只要操作涉及到数据的增删改,就一定要考虑安全问题。

(3)事务如何做到多条DML语句同时成功和同时失败:

InnoDB存储引擎:提供一组用来记录事务性活动的日志文件

事务开启了:

insert

insert

delete

update

update

事务结束了

在事务的执行过程中,每一条DML的操作都会记录到"事务性活动的日志文件"当中

在事务的执行过程中,可以提交事务,也可以回滚事务

  • 提交事务:清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。提交事务标志着事务的结束,并且是一种全部成功的结束。
  • 回滚事务:将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件。回滚事务标志着事务的结束,并且是一种全部失败的结束。

(4)如何提交事务和回滚事务:

  • 提交事务:commit;语句
  • 回滚事务:rollback;语句

测试一下,在mysql当中默认的事务行为是怎样的:

mysql默认情况下是支持自动提交事务的(自动提交事务:每执行一条DML语句,则提交一次)

将mysql的自动提交机制关闭:start transaction;

(5)事务包括4个特性:

  • A原子性:事务是最小的工作单元,不可再分
  • C一致性:在同一个事务中,所有操作必须同时成功,或者同时失败,以保证数据的一致性
  • I隔离性:A事务和B事务之间具有一定的隔离
  • D持久性 :事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上

(6)事务的隔离性:

事务和事务之间的隔离级别:

  • 读未提交:read uncommitted(最低的隔离级别)
    • 事务A可以读取到事务B未提交的数据
    • 这种隔离级别存在的问题就是脏读现象(Dirty Read)
    • 这种隔离级别一般是理论上的
  • 读已提交:read committed
    • 事务A可以读取到事务B提交之后的数据
    • 这种隔离级别解决了脏读现象
    • 存在的问题:不可重复读取数据,在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的时候,读取到的数据是4条,3≠4,即不可重复读取
    • 这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实。oracle数据库默认的隔离级别是read committed
  • 可重复读:repeatable read
    • 事务A开启之后,不管是多久,每一次事务A读取到的数据都是一致的,即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读。
    • 解决了不可重复读取数据
    • 存在的问题:可能会出现幻影读
    • mysql默认的事务隔离级别是repeatable read
  • 序列化/串行化:serializable(最高的隔离级别)
    • 每一次读取到的数据都是最真实的,并且效率最低,解决了所有问题
    • 表示事务排队,不能并发

(7)验证各种隔离级别

①read uncommitted

② read committed

③repeatable read

④serializable

相关推荐
新知图书1 小时前
MySQL用户授权、收回权限与查看权限
数据库·mysql·安全
文城5211 小时前
Mysql存储过程(学习自用)
数据库·学习·mysql
沉默的煎蛋1 小时前
MyBatis 注解开发详解
java·数据库·mysql·算法·mybatis
C语言扫地僧1 小时前
MySQL 事务及MVCC机制详解
数据库·mysql
小镇cxy2 小时前
MySQL事物,MVCC机制
数据库·mysql
雾里看山2 小时前
【MySQL】 库的操作
android·数据库·笔记·mysql
꧁瀟洒辵1恛꧂3 小时前
从新手到高手的蜕变:MySQL 视图进阶全攻略
数据库·mysql
doubt。15 小时前
【BUUCTF】[RCTF2015]EasySQL1
网络·数据库·笔记·mysql·安全·web安全
小辛学西嘎嘎15 小时前
MVCC在MySQL中实现无锁的原理
数据库·mysql
咩咩大主教19 小时前
Go语言通过Casbin配合MySQL和Gorm实现RBAC访问控制模型
mysql·golang·鉴权·go语言·rbac·abac·casbin