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 triggersG
				*************************** 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;


原文地址:https://www.cnblogs.com/jinhongquan/p/11849685.html