mysql事务,视图,触发器,存储过程与备份
.事务
通俗的说,事务指一组操作,要么都执行成功,要么都执行失败
思考:
我去银行给朋友汇款,
我卡上有1000元,
朋友卡上1000元,
我给朋友转账100元(无手续费),
如果,我的钱刚扣,而朋友的钱又没加时,
网线断了,怎么办?
演示:
create table user (
id int auto_increment primary key,
name varchar(32) not null default '',
salary int not null default 0
)charset utf8;
insert into user (name, salary) values ('zekai', 1000);
insert into user (name, salary) values ('min', 1000);
解决的方法:
使用事务:
start transaction;
sql语句
commit/rollback;
例子:
commit成功:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> update user set salary=900 where name='zekai';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from user;
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | zekai | 900 |
| 2 | min | 1000 |
+----+-------+--------+
2 rows in set (0.00 sec)
mysql> update user set salary=1100 where name='min';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from user;
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | zekai | 900 |
| 2 | min | 1100 |
+----+-------+--------+
2 rows in set (0.00 sec)
mysql> #2.提交
mysql> commit;
Query OK, 0 rows affected (0.06 sec)
rollback回滚:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql> update user set salary=800 where name='zekai';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from user;
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | zekai | 800 |
| 2 | min | 1100 |
+----+-------+--------+
2 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.11 sec)
mysql> select * from user;
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | zekai | 900 |
| 2 | min | 1100 |
+----+-------+--------+
2 rows in set (0.00 sec)
rollback回滚,影响所有:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> update user set salary=800 where name='zekai';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update user set salary=700 where name='zekai';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from user;
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | zekai | 700 |
| 2 | min | 1100 |
+----+-------+--------+
2 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.05 sec)
mysql> select * from user;
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | zekai | 900 |
| 2 | min | 1100 |
+----+-------+--------+
2 rows in set (0.00 sec)
特性:(****************)
原子性(Atomicity),原子意为最小的粒子,即不能再分的事务,要么全部执行,要么全部取消(就像上面的银行例子)
一致性(Consistency):指事务发生前和发生后,数据的总额依然匹配
隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的
持久性(Durability):当事务完成后,其影响应该保留下来,不能撤消,只能通过“补偿性事务”来抵消之前的错误
存储引擎:(**************)
InnoDB : 保时捷引擎
MyIsam : 奔奔引擎
建表的时候,
create table user (
id int auto_increment primary key,
name varchar(32) not null default '',
salary int not null default 0
)engine=Innodb charset utf8;
mysql5.5以上, 默认用到就是InnoDB
两个引擎的区别:(**************)
1. Innodb支持事务,MyISAM不支持
2. InnoDB支持行锁,MyISAM支持的表锁
.视图
项目, 有100个SQl, 其中80个SQL都是:select * from user where name='xxx';
增加视图:
create view 视图名 as SQL语句;
删除:
drop view v1;
例子:
mysql> select * from user where name='zekai';
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | zekai | 900 |
+----+-------+--------+
1 row in set (0.00 sec)
mysql> create view v1 as select * from user where name='zekai';
Query OK, 0 rows affected (0.07 sec)
mysql>
mysql> show tables;
+-----------------+
| Tables_in_test3 |
+-----------------+
| user |
| v1 |
+-----------------+
2 rows in set (0.00 sec)
mysql> select * from v1;
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | zekai | 900 |
+----+-------+--------+
1 row in set (0.00 sec)
.触发器
两张表:
订单表 库存表
场景:
当我下一个订单的时候, 订单表中需要增加一个记录, 同时库存表中需要减1
这两个操作是同时发生的, 并且前一个操作出发后一个操作
使用方法:
增加:
delimiter //
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON t2 FOR EACH ROW
BEGIN
INSERT INTO t3 (NAME) VALUES ('aa');
END //
delimiter ;
### 当向tb1表中添加一条数据的同时, 向tb2表添加一条数据
查看:
show triggers\G
*************************** 1. row ***************************
Trigger: tri_before_insert_tb1
Event: INSERT
Table: t2
Statement: BEGIN
INSERT INTO t3 (NAME) VALUES ('aa');
END
Timing: BEFORE
Created: 2019-11-01 11:47:20.65
sql_mode: ONLY_FULL_GROUP_BY
Definer: root@localhost
character_set_client: gbk
collation_connection: gbk_chinese_ci
Database Collation: latin1_swedish_ci
删除:drop trigger 触发器名;
例子:
mysql> select * from t2;
Empty set (0.00 sec)
mysql> select * from t3;
Empty set (0.00 sec)
mysql> insert into t2 (name) values ('zekai');
Query OK, 1 row affected (0.06 sec)
mysql> select * from t2;
+----+-------+
| id | name |
+----+-------+
| 1 | zekai |
+----+-------+
1 row in set (0.00 sec)
mysql> select * from t3;
+----+------+
| id | name |
+----+------+
| 1 | aa |
+----+------+
1 row in set (0.00 sec)
.存储过程
像 一个 SQL函数
创建:
delimiter //
create procedure p1()
BEGIN
select * from user where id=2;
END //
delimiter ;
例子:
mysql> delimiter //
mysql> create procedure p1()
-> BEGIN
-> select * from user where id=2;
-> END //
Query OK, 0 rows affected (0.10 sec)
mysql> delimiter ;
mysql> call p1();
+----+------+--------+
| id | name | salary |
+----+------+--------+
| 2 | min | 1100 |
+----+------+--------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
删除:
drop procedure p1;
.函数
CHAR_LENGTH(str)
返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。
CONCAT(str1,str2,...)
字符串拼接
如有任何一个参数为NULL ,则返回值为 NULL。
FORMAT(X,D)
将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。
例如:
SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
INSTR(str,substr)
返回字符串 str 中子字符串的第一个出现位置。
LEFT(str,len)
返回字符串str 从开始的len位置的子序列字符。
LOWER(str)
变小写
UPPER(str)
变大写
LTRIM(str)
返回字符串 str ,其引导空格字符被删除。
RTRIM(str)
返回字符串 str ,结尾空格字符被删去。
SUBSTRING(str,pos,len)
获取字符串子序列
LOCATE(substr,str,pos)
获取子序列索引位置
REPEAT(str,count)
返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
若 count <= 0,则返回一个空字符串。
若str 或 count 为 NULL,则返回 NULL 。
REPLACE(str,from_str,to_str)
返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
REVERSE(str)
返回字符串 str ,顺序和字符顺序相反。
RIGHT(str,len)
从字符串str 开始,返回从后边开始len个字符组成的子序列
数据库的备份
为啥要备份?
将重要的数据保存下来
用法:
#语法:
# mysqldump -h 服务器 -u用户名 -p密码 数据库名 表名, 表名,.... > aaa.sql
#示例:
#单库备份
mysqldump -uroot -p123 db1 > db1.sql
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql
#多库备份
mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql
#备份所有库
mysqldump -uroot -p123 --all-databases > all.sql
重新导入:
mysql> source D:/test3.sql;
mysql事务,视图,触发器,存储过程与备份的更多相关文章
- Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101
视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由 ...
- MySQL 索引 视图 触发器 存储过程 函数
1.索引 索引相当于图书的目录,可以帮助用户快速的找到需要的内容. 数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万 ...
- mysql 视图 触发器 存储过程 函数事务 索引
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
- 第五章 MySQL事务,视图,索引,备份和恢复
第五章 MySQL事务,视图,索引,备份和恢复 一.事务 1.什么是事务 事务是一种机制,一个操作序列,它包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求.要么都执行 ...
- day40 mycql 视图,触发器,存储过程,函数
视图,触发器,存储过程,自定义函数 -- 回顾 1.mysql 约束 1.非空 not null 2. 主键约束 primary key 3. 唯一约束 unique 4. 外键约束 foreign ...
- Mysql 视图,触发器,存储过程,函数,事务
视图 视图虚拟表,是一个我们真实查询结果表,我们希望将某次查询出来的结果作为单独的一个表,就叫视图,无法对图字段内容进行增删改. --格式: CREATE VIEW 视图名字 AS 操作; --比如: ...
- MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式
视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...
- mysql 查询表,视图,触发器,函数,存储过程
1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND TAB ...
- mysql事务、触发器、视图、存储过程、函数
存储过程: procedure 概念类似于函数,就是把一段代码封装起来, 当要执行这一段代码的时候,可以通过调用该存储过程来实现. 在封装的语句体里面,可以用if/else, case,while等控 ...
随机推荐
- fio 硬盘测试工具
一.windows环境 1. 安装fio:http://www.bluestop.org/fio/ 可以选择不同版本的安装,安装后在C:\Program Files\fio目录中可以找到fio的执行程 ...
- 【JulyEdu-Python基础】第 1 课:入门基础
一些学习资源的收集: 可汗学院 视频 公开课 Grossin 编程教室: 一个非常简单,对初学者非常友好的教程和在线联系 廖雪峰教程 书籍: Python核心编程: 这本书应该是最清楚.最深入全面的书 ...
- 强化学习应用于游戏Tic-Tac-Toe
Tic-Tac-Toe游戏为3*3格子里轮流下棋,一方先有3子成直线的为赢家. 参考代码如下,我只删除了几个没用的地方: ####################################### ...
- [转帖]docker-compose
docker-compose https://www.cnblogs.com/embedded-linux/p/10714179.html 需要学习使用一下. 改天自己再改改用过的yaml文件. ...
- (5.11)mysql高可用系列——复制中常见的SQL与IO线程故障
关键词:mysql复制故障处理 [1]手工处理的gtid_next(SQL线程报错) 例如:主键冲突,表.数据库不存在,row模式下的数据不存在等. [1.1]模拟故障:GTID模式下的重复创建用户 ...
- 如何重装mysql8及初次修改密码
首先在设置里卸载旧版的mysql 然后把你之前的安装的mysql文件夹整个删掉 然后删除注册表的MySQL信息 安装新版的MySQL 新建并配置my-default.ini文件 如下: [mysqld ...
- [Bzoj1001][BeiJing2006]狼抓兔子(网络流/对偶图)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 看到大佬们都是对偶图过的,写了个最大流水过去了QAQ,网络流的无向图直接建双向边( ...
- Manacher模版
现在讲的也是一种处理字符串的方法,叫做Manacher,有点像“马拉车” 1179: [视频][Manacher]最长回文子串 时间限制: 1 Sec 内存限制: 128 MB提交: 209 解决 ...
- cmd_操作MySQL数据库
建议用 TXT 文档来写代码 然后粘贴至cmd命令直接运行创建students库,表名为student,表包含以下字段: id(主键) name(姓名) age(年龄) sex(性别) sc(综合积分 ...
- Spring防止Xss配置
web.xml配置 <!-- xss过滤器 --> <filter> <filter-name>XssFilter</filter-name> < ...