事务、视图、触发器、存储过程、函数、数据库的备份

1.事务
通俗的说,事务指一组操作,要么都执行成功,要么都执行失败

思考:
我去银行给朋友汇款,
我卡上有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;

#操作完撤回事务所有sql语句操作:
    start transaction;
sql语句
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支持的表锁




2.视图

项目, 有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)



3.触发器

两张表:
订单表 库存表

场景:
当我下一个订单的时候, 订单表中需要增加一个记录, 同时库存表中需要减1
这两个操作是同时发生的, 并且前一个操作出发后一个操作

使用方法:
      增加:
delimiter //

create trigger tri_befor_intsert _tb1 before insert on tb1 for each row
   begin
     insert into tb2 (name) values('aa') #插入的sql语句
   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)


4.存储过程

像 一个 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;



5.函数 select 函数名(参数)
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('helloworld','h')
  结果为 1

返回字符串 str 中子字符串的第一个出现位置。

left('helloworld',3)
  结果为‘hel’

返回字符串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个字符组成的子序列


http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions




6.运维方向:
数据库的备份 cmd下执行语句

为啥要备份?
将重要的数据保存下来

用法:
#语法:
# mysqldump -h 服务器 -u用户名 -p密码 数据库名 表名, 表名,.... > aaa.sql

#示例:
#单库备份
mysqldump -uroot -p123 db1 > D:\db1.sql #备份整个db1库
mysqldump -uroot -p123 db1 table1 table2 >D:\ db1-table1-table2.sql # 备份db1库里面的表

#多库备份
mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql

#备份所有库
mysqldump -uroot -p123 --all-databases > all.sql

重新导入:
  create database test3;
  use test 3;

mysql> source D:/test3.sql;

posted on 2019-11-01 15:27  啥是py  阅读(151)  评论(0编辑  收藏  举报

导航