事务
基本概念
- 事务: Transaction
- 事务是由一个或多个sql语句构成的逻辑单元, 是一个整体的概念
- 作用: 使得一系列sql语句要么全部完成, 要目全部不完成, 保证了数据库的完整性
四大特性(ACID)
- 原子性 (Atomicity): 事务是最小执行单位, 不可再分, 既一个事务中的所有操作, 要么全部完成, 要么全部不完成
- 一致性 (Consistency): 事务开始之前和结束之后, 数据库的完整性没有被破坏
- 隔离性 (Isolation): 数据库支持多个事务并发, 隔离性可以防止事务交叉执行导致的不一致
- 读未提交
- 读提交
- 可重复读
- 串行化
- 持久性 (Durability): 事务处理结束后, 对数据的修改时永久的
使用方法
start transaction;
开启commit;
提交rollback;
回滚
第一步: 开启事务, 执行操作
# alpha 对 bravo 转账 100 mysql> select * from balance; +----+-------+-------+ | id | name | money | +----+-------+-------+ | 1 | alpha | 1000 | | 2 | bravo | 1000 | +----+-------+-------+ 2 rows in set (0.00 sec) # 开启事务 mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> update balance set money=1000-100 where name='alpha'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> update balance set money=1000+100 where name='bravo'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from balance; +----+-------+-------+ | id | name | money | +----+-------+-------+ | 1 | alpha | 900 | | 2 | bravo | 1100 | +----+-------+-------+ 2 rows in set (0.00 sec)
第二步: 此时我们还未提交事物, 我们新开一个窗口, 查看一下balance表
mysql> select * from balance; +----+-------+-------+ | id | name | money | +----+-------+-------+ | 1 | alpha | 1000 | | 2 | bravo | 1000 | +----+-------+-------+ 2 rows in set (0.00 sec)
第三步: 然后我们提交事物
mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select * from balance; +----+-------+-------+ | id | name | money | +----+-------+-------+ | 1 | alpha | 900 | | 2 | bravo | 1100 | +----+-------+-------+ 2 rows in set (0.00 sec)
第四步: 在新的窗口查看balance表, 数据修改成功
mysql> select * from balance; +----+-------+-------+ | id | name | money | +----+-------+-------+ | 1 | alpha | 900 | | 2 | bravo | 1100 | +----+-------+-------+ 2 rows in set (0.00 sec)
如果我们在第三步的时候不提交, 回滚一下事务
mysql> select * from balance; +----+-------+-------+ | id | name | money | +----+-------+-------+ | 1 | alpha | 1000 | | 2 | bravo | 1000 | +----+-------+-------+ 2 rows in set (0.00 sec) # 开启事务 mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> update balance set money=1000-100 where name='alpha'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> update balance set money=1000+100 where name='bravo'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from balance; +----+-------+-------+ | id | name | money | +----+-------+-------+ | 1 | alpha | 900 | | 2 | bravo | 1100 | +----+-------+-------+ 2 rows in set (0.00 sec) # 回滚事务 mysql> rollback; Query OK, 0 rows affected (0.01 sec) # 数据没有被修改 mysql> select * from balance; +----+-------+-------+ | id | name | money | +----+-------+-------+ | 1 | alpha | 1000 | | 2 | bravo | 1000 | +----+-------+-------+ 2 rows in set (0.00 sec)
存储引擎
- InnoDB (MySQL默认)
MyISAM (我的阿萨姆?)
- 区别
- InnoDB支持事务
- InnoDB支持行锁(并发), MyISAM只支持表锁
视图
基本概念
- 根据select查询语句得到一个具有名称的动态数据集, 用户只要通过视图名称就可获取这个数据集
使用方法
- 增加视图
create view 视图名 as select查询语句
- 使用视图 (相当于一个表)
select * from 视图名
- 删除视图
drop view 视图名
mysql> select * from user_info; +----+---------+----------+ | id | name | password | +----+---------+----------+ | 1 | bigb | 111111 | | 2 | blake | 222222 | | 3 | black | 333333 | | 4 | alpha | 111111 | | 5 | bravo | 222222 | | 6 | charlie | 333333 | | 7 | delta | 111111 | | 8 | echo | 222222 | | 9 | foxtrot | 333333 | +----+---------+----------+ 9 rows in set (0.00 sec) mysql> select * from user_info where name='alpha'; +----+-------+----------+ | id | name | password | +----+-------+----------+ | 4 | alpha | 111111 | +----+-------+----------+ 1 row in set (0.00 sec) # 创建视图 mysql> create view v1 as select * from user_info where name='alpha'; Query OK, 0 rows affected (0.01 sec) # 使用视图 mysql> select * from v1; +----+-------+----------+ | id | name | password | +----+-------+----------+ | 4 | alpha | 111111 | +----+-------+----------+ 1 row in set (0.00 sec) # 如果我们对原表记录进行了修改, 发现视图中的数据也进行了相应的修改, 因此通过视图得到是一个动态的数据集 mysql> update user_info set password='888888' where name='alpha'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from v1; +----+-------+----------+ | id | name | password | +----+-------+----------+ | 4 | alpha | 888888 | +----+-------+----------+ 1 row in set (0.00 sec) # 删除视图 mysql> drop view v1; Query OK, 0 rows affected (0.00 sec)
触发器
基本概念
- 对表1进行某些特定操作时会触发对表2的某些特定操作
使用方法
- 创建触发器
delimiter 结束符号(自定义) create trigger 触发器名 before/after 触发事件 on 表名 for each row begin 触发器触发的内容; end 结束符号 delimiter; # 将结束符号改回;
- 例子: 实现对 t1 添加记录时 , 也向 t2 添加一条记录
# t1 和 t2 为两个空表 mysql> select * from t1; Empty set (0.00 sec) mysql> select * from t2; Empty set (0.00 sec) # 创建触发器 mysql> delimiter // mysql> create trigger tri_nb after insert on t1 for each row -> begin -> insert into t2 (name) values ('bravo'); -> end // Query OK, 0 rows affected (0.01 sec) mysql> delimiter ; # 对 t1 进行操作 mysql> insert into t1 (name) values ('alpha'); Query OK, 1 row affected (0.01 sec) mysql> select * from t1; +----+-------+ | id | name | +----+-------+ | 1 | alpha | +----+-------+ 1 row in set (0.00 sec) mysql> select * from t2; +----+-------+ | id | name | +----+-------+ | 1 | bravo | +----+-------+ 1 row in set (0.00 sec)
存储过程
基本概念
- 对sql语句进行了封装, 方便后期调用, 相当于MySQL中的函数
使用方法
- 创建
delimiter 结束符号 create procedure p1(IN 参数 int) # IN表示传入参数, 参数类型为int begin sql语句; end 结束符号 delimiter 结束符号
使用
call p1(参数);
- 删除
drop procedure p1;
例子
+----+---------+----------+ | id | name | password | +----+---------+----------+ | 1 | bigb | 111111 | | 2 | blake | 222222 | | 3 | black | 333333 | | 4 | alpha | 888888 | | 5 | bravo | 222222 | | 6 | charlie | 333333 | | 7 | delta | 111111 | | 8 | echo | 222222 | | 9 | foxtrot | 333333 | +----+---------+----------+ # 创建 mysql> delimiter // mysql> create procedure p1(IN p_in int) -> begin -> select * from user_info where id = p_in; -> end // Query OK, 0 rows affected (0.01 sec) mysql> delimiter ; # 调用 mysql> call p1(3); +----+-------+----------+ | id | name | password | +----+-------+----------+ | 3 | black | 333333 | +----+-------+---------+ 1 row in set (0.00 sec)
数据备份
备份
- 单库备份
mysqldump -u用户名 -p密码 数据库名 > 备份文件.sql
mysqldump -u用户名 -p密码 数据库名 表1 表2 > 备份文件.sql
对库下面的表进行备份
- 多库备份
mysqldump -u用户名 -p密码 --databases 数据库1 数据库2 > 备份文件.sql
- 备份所有
mysqldump -u用户名 -p密码 --all-databases > 备份文件.sql
导入
source D:\all.sql