自我总结32

事务

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

解决的方法:


使用事务
start transaction 开始事务

sql语句

commit 提交

rollback 回滚


acid特性:

原子性(Atomicity),原子意为最小的粒子,即不能再分的事务,要么全部执行,要么全部取消(就像上面的银行例子)

一致性(Consistency):指事务发生前和发生后,数据的总额依然匹配

隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的

持久性(Durability):当事务完成后,其影响应该保留下来,不能撤消,只能通过“补偿性事务”来抵消之前的错误
例子:
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> 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)

存储引擎

InnoDB:保时捷引擎

MyIsam:奔奔引擎

mysql 5.5以上,默认用到就是InnoDB

两个引擎的区别:

​ 1.InnoDB支持事物,MyISAM不支持

​ 2.InnoDB支持行锁,MyISAM支持表锁

建表的时候
create table user (
 	id int auto_increment prim ary key,
 	name varchar(32) not null default '',
 	salary int not null default 0
)engine=Innodb charset utf8;

视图

项目, 有100个SQl, 其中80个SQL都是:select * from user where name='xxx';

增加视图

create view 视图名 as SQL语句;

删除

drop view v1;

触发器

两张表

订单表 库存表

场景

当下一个订单的时候,订单表中需要增加一个记录,同时库存表中需要减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

删除:

drop trigger 触发器名;

存储过程

像一个SQL函数

创建:

delimiter//

create procedure p1()

BEGIN

    select * from user where id=2;

END//

delimiter;

删除:

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 -p 服务器 -u用户名 -p密码 数据库名 表名,表名,...>aaa.sql

单库备份

mysqldump -uroot -p123 db1>db1.sql
mysqldump -uroot -p123 db1 table1 table2 >db1-table1-table2.sql

多库备份

mysqldump -uroot -p123 --datrabases db1 db2 mysql db3>db1_db2_mysql_db3.sql

备份所有库

mysqldump -uroot -p123 --all-datrabases > all.sql

重新导入

mysql > source D:/test3.sql;
posted @ 2019-11-03 23:41  jzm1201  阅读(122)  评论(0编辑  收藏  举报