数据库主键,指的是一个列或多列的组合,其值能唯一的标识表中的每一行,通过它可强制表的实体完整性。
主键可以用来表示一个精确定位的特定的行,如果没有主键,你就无法精准定位一条记录是否就是你要的相关行记录,这样就会导致更新或删除表中特定的行很困难。
而如果我们有主键来约束行记录的唯一性后,就可以利用主键来解决这个问题。
主键的作用:
1)保证实体的完整性;
2)加快数据库的操作速度。
3) 在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
4) DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。
什么是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(‘赵‘)