第62天学习打卡(MySQL 数据库级别的MD5加密 事务 索引)

数据库中为什么要设置主键及其作用:

数据库主键,指的是一个列或多列的组合,其值能唯一的标识表中的每一行,通过它可强制表的实体完整性。

主键可以用来表示一个精确定位的特定的行,如果没有主键,你就无法精准定位一条记录是否就是你要的相关行记录,这样就会导致更新或删除表中特定的行很困难。

而如果我们有主键来约束行记录的唯一性后,就可以利用主键来解决这个问题。

主键的作用:

1)保证实体的完整性;

2)加快数据库的操作速度。

3) 在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。

4) DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

5.3 数据库级别的MD5加密(扩展)

什么是MD5:信息摘要算法

主要增强算法复杂度和不可逆性。

MD5不可逆,具体的值的MD5是一样的

MD5破解网站的原理,背后有一个字典,如果破解了MD5加密后 的值,就会返回加密前的值

 ?
 -- ================== 测试MD5加密===================
  CREATE TABLE `testmd5`(
 
  `id` INT(4) NOT NULL,
  `name` VARCHAR(20) NOT NULL,
  `pwd` VARCHAR(50) NOT NULL,
  PRIMARY KEY(`id`)
   
  )ENGINE=INNODB DEFAULT CHARSET=utf8
 
  -- 明文密码
  INSERT IGNORE INTO testmd5 VALUES(1,‘zhangsan‘,‘123456‘),(2,‘lisi‘,‘123456‘),(3,‘wangwu‘,‘123456‘)
 
  -- 加密
 UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1 -- 加密第一个
 UPDATE testmd5 SET pwd=MD5(pwd)  -- 全部加密
 ?
  -- 插入的时候加密
  INSERT INTO testmd5 VALUES(4,‘xiaoming‘,MD5(‘123456‘))
 
  -- 如何校验:将用户传递进来的密码,进行md5加密,然后对比加密后的值
  SELECT * FROM testmd5 WHERE `name` = ‘xiaoming‘ AND pwd=MD5(‘123456‘)
 
 

6.事务 Transaction(重点 面试)

要么都成功,要么都失败


1.SQL 执行 A 给B转账 A 有1000 -------->转200给 B B原本有200

2.SQL执行 B 收到A的钱 之后 A剩800 ------->B有400


将一组SQL放在一个批次中去执行

事务原则:ACID原则 原子性Atomicity 一致性Consistency 隔离性Isolation 持久性Durability(脏读 ,幻读...)

 

原子性表示:这两个事务要么同时成功要么同时失败,不能只发生其中一个动作

一致性表示:针对一个事务操作前与操作后的状态一致 即指的是无论怎么转,最后的钱总共只有1200

持久性:表示事务结束后的数据不随着外界原因导致数据丢失

操作前:A:1000 B:200

操作后:A:800 B:400

如果在操作前(事务还没来得及提交)服务器宕机或者断电,那么重启数据库后,数据状态为:

A:1000 B:200

如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库后,数据状态为:

A:800 B:400

事务没有提交,恢复到原状

事务已经提交,持久化到数据结构,数据一旦提交就不可逆

隔离性:事务的隔离性是多个用户并发访问数据时,数据库为每个用户开启的事务,不能被其他事务的操作数据 所干扰,事务之间要相互隔离。

针对多个用户同时操作,主要是排除其他事务对本次事务的影响

比如A给B转账 C给B转账 这两个事务是不影响的因为有隔离性

隔离所导致的一些问题

脏读:指的是一个事务读取了另外一个事务没有提交的数据

不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同(着不一定是错误,只是某些场合不对)

比如页面统计查询值 B原本查询为200 当再次查询时变为B=400(因为点击生成表的时候,B有人转账进来了200(事务已提交))

虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(一般是行影响,多了一行)

 

执行事务

 -- ====================事务===================
 -- mysql是默认开启事务自动提交的
 SET autocommit = 0 /*关闭事务*/
 SET autocommit = 1 /*开启事务(默认的)*/
 ?
 -- 手动处理事务
 SET autocommit = 0   -- 关闭自动提交
 -- 事务开启
 START TRANSACTION  -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
 
 
  INSERT xxx
 
  INSERT xxx
 
 
  -- 提交:持久化(成功提交!)
  COMMIT
  -- 回滚: 回到原来是样子(提交失败)
 ROLLBACK
 
  -- 事务结束
  SET autocommit = 1   -- 开启自动提交
 
 
  -- 了解
  SAVEPOINT 保存点 -- 设置一个事务的保存点
  ROLLBACK TO SAVEPOINT 保存点 -- 回滚到保存点
  RELEASE SAVEPOINT 保存点 -- 撤销保存点
 
 

 

 

模拟转账场景

 -- 模拟事务   转账
 
  CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
 
  USE shop
 
 CREATE TABLE `account`(
 `id` INT(3) NOT NULL AUTO_INCREMENT,
 `name` VARCHAR(30) NOT NULL,
 `money`DECIMAL(9,2) NOT NULL,
 PRIMARY KEY(`id`)
 ?
 )ENGINE=INNODB DEFAULT CHARSET=utf8
 
  INSERT INTO `account`(`name`,`money`)
  VALUES (‘A‘,2000.00),(‘B‘,10000.00)
 
  -- 模拟转账:事务
  SET autocommit = 0; -- 关闭自动提交
  START TRANSACTION -- 开启一个事务(一组事务)
 
  UPDATE `account` SET money=money-500 WHERE `name` = ‘A‘ -- A减500
  UPDATE `account` SET money=money+500 WHERE `name` = ‘B‘ -- B加500
 
  COMMIT; -- 提交事务,一旦提交就被持久化了
  ROLLBACK; -- 回滚
  SET autocommit = 1; -- 恢复默认值
 

 

7索引

MySQL 官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。

提取句子主干,就可以得到索引的本质:索引是数据结构

7.1 索引的分类

在一个表中,主键索引只能有一个,唯一索引可以有多个

主键索引(PRIMARY KEY)

唯一的标识,主键不可重复,只能有一个列作为主键

唯一索引(UNIQUE KEY)

避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引

常规索引(KEY / INDEX)

默认的,index / key 关键字设置

全文索引(FullText)

在特定的数据库引擎下才有, MyISAM

快速定位数据

关于MySQL 优化 看懂 explain 的博客地址:https://blog.csdn.net/jiadajing267/article/details/81269067

基础语法

  -- 索引的使用
   -- 1.在创建表的时候给字段增加索引
   -- 2.创建完毕后,增加索引
   
   
   -- 显示所有的索引信息
  SHOW INDEX FROM student
 
  -- 增加一个全文索引(索引名) 列名
  ALTER TABLE school.student ADD FULLTEXT INDEX `studentname`(`studentname`);
 
  -- EXPLAIN 分析sql执行的情况
  EXPLAIN SELECT * FROM student;-- 非全文索引
 
  EXPLAIN SELECT * FROM student WHERE MATCH(studentname) AGAINST(‘赵‘)
 

 

 

第62天学习打卡(MySQL 数据库级别的MD5加密 事务 索引)

上一篇:数据库应用开发一、vs


下一篇:数据库范式随笔