事务
ACID务必了解清楚在看下面https://blog.csdn.net/dengjili/article/details/82468576(引用)
原子性:要么都成功,要么都失败。
一致性:事务前后的数据完整性要保证一致。意思是前面两个人200和三百总和是五百,如果相互转移了数据总和因该也是五百。
持久性:事务一但提交就不客逆了,被永久的保存在数据库中了。
隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
隔离的问题
脏读:
指一个事务读取了另外一个事务未提交的数据。
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
虚读(幻读):
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
(一般是行影响,多了一行)
https://www.bilibili.com/video/BV1NJ411J79W?p=28
事务练习语句:流程如下
-- 手动处理事务(先关闭事务)
SET autocommit=0 -- 事务关闭语句,关闭事务的自动提交功能
-- 事务开启
START TRANSACTION -- 标记一个事务的开始,执行这语句过后sql都在同一个事务中了
INSERT xx -- 插入事务
INSERT xx -- 插入事务
COMMIT -- 提交语句,当事务成功执行
ROLLBACK -- 回滚语句,意思是回到原来的样子,当事务失败执行
-- 事务结束
SET autocommit=1 -- 事务开启语句,这个是默认的,让事务自动提交
-- 事务保存
SAVEPOINT 保存位置名 -- 设置一个事务的保存位置
ROLLBACK TO SAVEPOINT 保存位置名 -- 回滚到保存点
RELEASE SAVEPOINT 保存位置名 -- 撤销保存点
一个事务可以拥有多个保存点
事务练习题
-- 创建数据
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf_general_ci -- 创建一个数据库
USE shop -- 使用shop这个数据库操作
-- 创建一个表
CREATE TABLE `account`( -- 创建一个表,表名为account
`id` INT(4) NOT NULL AUTO_INCREMENT, -- 创建一个id字段int类型4个字节,不能为null并且自增
`name` VARCHAR(30) NOT NULL, -- 创建一个name字段varChar类型30个字节,不能为null
`money` DECIMAL(9,2) NOT NULL, -- 创建一个money字段decimal类型小数2位总长9位,并且不能为null
PRIMARY KEY(`id`) -- 将id设置为主键
)ENGINE=INNODB DEFAULT CHARSET=utf8 -- 表属性
-- 生成数据
INSERT INTO account(`name`,`money`) --给name、money插入数据
VALUES ('A',2000.00),('B',10000.00) -- 插入两行数据,一个是名字A,2000money,一个是名字B,10000money,由于id是自增的说以不用管
-- 模拟转账行为(事务功能)
SET autocommit=0; -- 关闭自动提交
START TRANSACTION --开启一个事务,现在起执行语句都是一个事务
UPDATE account SET money=money-500 WHERE `name`='A' -- A的money减少500
UPDATE account SET money=money+500 WHERE `name`='B' -- B的money增加500
COMMIT; --提交语句 ,当转账正常执行该语句,保存数据到数据库
ROLLBACK;-- 回滚语句,当转账不正常执行该语句,这样数据库数据不会变动
SET autocommit=1; -- 恢复自动提交功能
https://www.bilibili.com/video/BV1NJ411J79W?p=29
索引
mySQL官方对索引的定义为:索引是帮助mySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。
- 主键索引(PRIMARY KEY)
- 唯一索引(UNIQUE KEY)
- 常规索引 (KEY或者INDEX)
- 全文索引 (FULLTEXT)
索引的使用
1、在创建表的时候给字段添加索引
2、创建完毕后,添加索引
SHOW INDEX FROM 表名 -- 查询该表的索引信息
ALTER TABLE 库名.表名 ADD FULLTEXT INDEX `字段名`(`字段名字`);
-- 修改索引将字段改为全文索引(FULLTEXT)
EXPLAIN SELECT*FROM 表名; -- 非全文索引
EXPLAIN SELECT*FROM 表名 WHERE MATCH(字段) AGAINST('关键字'); -- 查询关键字的信息
https://www.bilibili.com/video/BV1NJ411J79W?p=30
索引例子
-- CREATE INDEX 索引名 ON 表(字段)
CREATE INDEX id_表名_字段名 ON 表名(`字段名`)
--原理就是给字段创建了一个隐形的字段,每个值有一个唯一的数字,当查询的时候就直接去查找这个数字一样
-- 所以提升了查询速率
例子位置https://www.bilibili.com/video/BV1NJ411J79W?p=31
索引原则
1、索引不是越多越好
2、不要给经常变动的数据加索引
3、少量数据不需要添加索引,因为用处不大
4、索引一般添加在常用的字段上来查询
扩充知识点(很重要)http://blog.codinglabs.org/articles/theory-of-mysql-index.html
*
学习地址https://www.bilibili.com/video/BV1NJ411J79W?p=32
SQL用户账号操作
CREATE USER 用户名 IDENTIFIED BY '密码' --创建一个用户
SET PASSWORD = PASSWORD('修改的密码')--修改密码
SET PASSWORD FOR 用户名= PASSWORD('修改的密码')--给指定的用户修改密码
RENAME USER 旧用户名称 TO 新用户名称 --修改用户名
--用户授权 ALL PRIVILEGES 全部的权限 *.*(是 库.表 *是全部的意思)
--ALL PRIVILEGES 除了给别人授权不行,其他的都能干
GRANT ALL PRIVILEGES ON *.* TO 用户 --给该用户所有的权限
--查询权限
SHOW GRANTS FOR 用户 --结果为用户权限的语句
-- 撤销权限 REVOKE
REVOKE ALL PRIVILEGES ON *.* FROM 用户名
-- 撤销该用户名的说有权限
DROP USER 用户名 --删除该用户
https://www.bilibili.com/video/BV1NJ411J79W?p=33
备份
备份的直接操作可以选中后右键备份。
命令备份是在Win中备份备份方法
https://www.bilibili.com/video/BV1NJ411J79W?p=34