MySQL数据库5事务、视图、触发器、函数、数据库的备份

目录

  • 一、事务(important)

    • 1.1什么是事务?
    • 1.2解决办法
      • 1.2.1事务的语法
      • 1.2.2使用事务解决转账问题代码演示
      • 1.2.3rollback
    • 1.3事务的特性(important)
  • 二、存储引擎(important)
    • 2.1 innodb
    • 2.2 myisam
    • 2.3两种引擎的区别
  • 三、视图
  • 四、触发器
    • 4.1简述
    • 4.2用法
      • 4.2.1增加
      • 4.2.2删除
  • 五、存储过程
    • 5.1存储过程的创建
    • 5.2存储过程的删除
  • 六、函数
  • 七、数据库的备份
    • 7.1数据库的备份
    • 7.2数据库的导入

也许人生就是这样,我们花大把时间迷茫,然后在几个瞬间成长。——无意间看到的一句话

一、事务(important)

1.1什么是事务?

事务指一组操作要么成功要么失败,在成功修改数据前原来的数据不会受影响,如果修改成功则数据将被更改,如果失败,则原数据库数据不变。

思考:银行转账,转账人如果已经进行了转账操作,而在对方还未收到转账时如果发生网络故障,对方没有收到钱,这个转着账如何处理?这时候就用到了事务,转账要么成功,两边数据都修改,要么失败,两边的数据都不变。

代码演示

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 ('zgh',1000);
insert into user (name,salary) values ('xiaoyu',1000);

1.2解决办法

1.2.1事务的语法

start transaction ;
sql语句,即要执行的任务
commit / rollback;(commit 是提交,rollback 是撤回,这里的撤回是撤回事务里的所有SQL语句)

1.2.2使用事务解决转账问题代码演示

mysql> create table user (id int auto_increment primary key,
    -> name varchar(32) not null default '',
    -> salary decimal(10,2) not null default 0) charset utf8;
Query OK, 0 rows affected (0.62 sec)

mysql> insert into user(name,salary) values('zgh',1000);
Query OK, 1 row affected (0.13 sec)

mysql> insert into user(name,salary) values('xiaoyu',1000);
Query OK, 1 row affected (0.10 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> update user set salary = 900 where name = 'zgh';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | zgh    |  900.00 |
|  2 | xiaoyu | 1000.00 |
+----+--------+---------+
2 rows in set (0.00 sec)

mysql> update user set salary = 1100 where name = 'xiaoyu';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | zgh    |  900.00 |
|  2 | xiaoyu | 1100.00 |
+----+--------+---------+
2 rows in set (0.01 sec)

mysql> commit;#在commit之前前面的所有对数据的操作都不会在数据库中生效,
#只有提交之后对数据库的修改才会真正的生效
Query OK, 0 rows affected (0.09 sec)

mysql> select * from user;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | zgh    |  900.00 |
|  2 | xiaoyu | 1100.00 |
+----+--------+---------+
2 rows in set (0.00 sec)

1.2.3rollback

代码演示

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> update user set salary = 800 where name = 'zgh';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | zgh    |  800.00 |
|  2 | xiaoyu | 1100.00 |
+----+--------+---------+
2 rows in set (0.00 sec)

mysql> update user set salary = 1200 where name = 'xiaoyu';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | zgh    |  800.00 |
|  2 | xiaoyu | 1200.00 |
+----+--------+---------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.09 sec)

mysql> select * from user;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | zgh    |  900.00 |
|  2 | xiaoyu | 1100.00 |
+----+--------+---------+
2 rows in set (0.00 sec)

1.3事务的特性(important)

原子性(atomicity):原子意思是最小的粒子,即不能再分的事务,要么全部执行,要么全部取消(如银行转账)。

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

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

持久性(durability):当时事务完成后,其影响会保留下来,不能撤销,只能通过“补偿性事务”来抵消之前的错误。

补偿事务就是再执行一个事物,把错误的数据修改过来。

二、存储引擎(important)

2.1 innodb

MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。现在公司一般使用innodb的比较多。

2.2 myisam

MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。

2.3两种引擎的区别

  1. innodb支持事务,myisam不支持
  2. innodb支持行锁,myisam支持表锁

    行锁和表锁参考此链接

三、视图

视图的功能就是将数据表显示出来,但是不能通过视图对表内的数据进行更改,相当于给原来的表格拍了一张照片,查看表格时可以不用写查询表格的SQL语句,直接通过查询视图来查看。

语法:增加视图:create view 视图名 as SQL语句;

? 删除视图:drop view 视图名;

例子

mysql> select * from user where name = 'zgh';
+----+------+--------+
| id | name | salary |
+----+------+--------+
|  1 | zgh  | 900.00 |
+----+------+--------+
1 row in set (0.00 sec)

mysql> create view v1 as select * from user where name = 'zgh';
Query OK, 0 rows affected (0.17 sec)

mysql> select * from v1;
+----+------+--------+
| id | name | salary |
+----+------+--------+
|  1 | zgh  | 900.00 |
+----+------+--------+
1 row in set (0.04 sec)

mysql> select name from v1;
+------+
| name |
+------+
| zgh  |
+------+
1 row in set (0.00 sec)

注意:视图功能实际工作中尽量不要用,会消耗数据库的性能。

四、触发器

4.1简述

功能:当某一个命令执行时会触发另一个命令的执行。

应用场景:当网点上有人下单时,订单表中需要增加一条记录,同时库存表中需要减少1,这两个操作是前一个操作触发了后一个操作。

4.2用法

4.2.1增加

create table user1 (id int auto_increment primary key,
name varchar(32) not null default '',
salary decimal(10,2) not null default 0) charset utf8;

mysql> delimiter //
mysql> create trigger tri_before_insert_user before insert on user for each row begin insert into user1 (name) values ('zgh2');
    -> end //
Query OK, 0 rows affected (0.07 sec)

mysql> delimiter ;#这里要加一个空格否则无法退出触发器的创建
mysql> insert into user(name) values ('xiaoyu');
Query OK, 1 row affected (0.10 sec)

mysql> select * from user1;
+----+----------+--------+
| id | name     | salary |
+----+----------+--------+
|  1 | guanghao |   0.00 |
|  2 | zgh2     |   0.00 |
+----+----------+--------+
2 rows in set (0.00 sec)

mysql> select * from user;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | zgh    |  900.00 |
|  2 | xiaoyu | 1100.00 |
|  3 | zgh1   |    0.00 |
|  4 | xiaoyu |    0.00 |
+----+--------+---------+
4 rows in set (0.00 sec)

4.2.2删除

语法:drop trigger 触发器名;

触发器的查看语法:

show triggers\G;

五、存储过程

存储过程如同编程语言中的函数,我们先定义好它的功能,然后在以后使用的时候只需要调用它就可以了。

存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

5.1存储过程的创建

mysql> delimiter //
mysql> create procedure p1()
    -> begin
    -> select * from user where id=1;
    -> end //
Query OK, 0 rows affected (0.11 sec)

mysql> delimiter ;
mysql> call p1();#调用存储过程的方法
+----+------+--------+
| id | name | salary |
+----+------+--------+
|  1 | zgh  | 900.00 |
+----+------+--------+
1 row in set (0.12 sec)

Query OK, 0 rows affected (0.12 sec)

5.2存储过程的删除

drop procedure 存储过程名;

六、函数

这里的函数指的是MySQL内置的函数,在实际工作中涉及到函数部分的功能尽量在程序里面完成,
不要使用MySQL的函数,否则会加大数据库的负担。

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

七、数据库的备份

目的:将重要的数据保存下来。

7.1数据库的备份

语法:

mysqldump -h 服务器 -u用户名 -p密码 数据库名 表名1,表名2……> 备份的文件名.sql

这里的服务器指的是服务器的ip注意ip不要加引号,直接跟在-p后面,备份程序在cmd或者其他环境下直接执行,不要在已经登录MySQL的环境下执行备份程序。

例子

PS C:\Users\ZGH> mysqldump -uroot -p123zgh test1 user > test_mysql.sql
#注意test_mysql.sql这里要加存储路径否则会默认c盘的这个相对路径
Warning: Using a password on the command line interface can be insecure.

7.2数据库的导入

如果这个sql文件是在windows的powershell里导出来的直接通过powershell或者cmd导入该文件会报如下错误。

ERROR:
ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query: '?t-'.

原因:powershell导出的文件默认编码格式是utf-16,须要将其转换为ASCII编码格式才能正常导入,可以用windows文件转码命令进行转码具体可参考此链接。另外网上也有在线转码工具,不过为了避免这种错误的发生,还是直接用cmd去备份文件然后用cmd导入。

导入命令:source 地址;

例子

mysql> source D:/test2-u7-u6.sql;
Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
......

注意:导入的时候不能出现和文件中相同的表名。

原文地址:https://www.cnblogs.com/ghylpb/p/11779741.html

时间: 2024-09-30 11:26:51

MySQL数据库5事务、视图、触发器、函数、数据库的备份的相关文章

Java学习总结(十八)——MySQL数据库(4)MySQL数据库中的视图,函数,存储过程中常见循环

一.MySQL存储过程中常见的循环1.while循环:WHILE.....DO.....END WHILE例1:创建存储过程(求1+2+.......+num的和):创建成功,进行调用:显示结果:2.REPEAT循环: REPEAT.........UNTLL END REPEAT例2:创建存储过程:创建完成,调用存储过程:显示结果:3.LOOP循环:LOOP END LOOP 例3:创建存储过程:创建成功,调用存储过程:显示结果:二.MySQL中的视图1.概念:有结构(有行有列),但没有结果(

Mysql视图触发器函数事务

1. 视图 100个SQL: 88: v1 select .. from v1 select asd from v1 某个查询语句设置别名,日后方便使用 - 创建 create view 视图名称 as SQL PS: 虚拟 - 修改 alter view 视图名称 as SQL - 删除 drop view 视图名称; 2. 触发器 当对某张表做:增删改操作时,可以使用触发器自定义关联行为 insert into tb (....) -- delimiter // -- create trig

mysql 查询表,视图,触发器,函数,存储过程

1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TABLE_TYPE ='BASE TABLE' mysql查询建表语句: show create table `表名` 2.mysql查询所有视图: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名'

14 MySQL 内置功能--视图/触发器

#视图 select * from course inner join teacher on course.teacher_id=teacher.tid; create view course2teacher as select * from course inner join teacher on course.teacher_id=teacher.tid; #触发器 CREATE TABLE cmd ( id INT PRIMARY KEY auto_increment, USER CHAR

数据库的事务

数据库事务:事务是数据库运行中的一个逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理. 以下内容部分介绍转自用户fjdingsd: 数据库支持事务的操作的数据库特性(ACID): ⑴ 原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一

数据库 --- 40 视图 触发器 存储过程 事务 函数

一.视图  (view) 视图是一种虚拟表,可以把查询出来的临时表保存下来 1.创建视图 2.删除视图 3.修改视图,(原始表的记录也跟着修改) 4.查看视图 二.  触发器(trigger)可进行  增删改  操作 1.创建触发器 2.删除触发器 实例: 三.存储过程  1. 优点: 缺点: 2.程序与数据库结合使用的三种方式 3.创建简单存储过程(无参) 4.创建存储过程(有参) ① in  传入参数 ② out  返回值 #查看存储过程的一些信息:show create procedure

Mysql之视图 触发器 事务 存储过程 函数

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用 #两张有关系的表 mysql> se

MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化

视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调: (1)在硬盘中,视图只有表结构文件,没有表结构数据 (2)视图通常是用于查询,尽量不要修改视图中的数据 dro

mysql视图,存储过程,函数,事务,触发器,以及动态执行sql

一.视图 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成.对其中所引用的基础表来说,视图的作用类似于筛选.定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图.通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少.视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据. 1.

mysql数据库索引和视图,触发器

索引简介  跟存储引擎有很大关系其实就是一种排序,生成一种算法,索引主要用在大数据量的时候使用,数据小根本没必要 索引在mysql中也叫做键,是存储引擎用于快速找到记录的一种数据结构,索引对于良好的性能非常关键,尤其是当表中的数据量越来越大的时候,索引对于性能的影响越发重要. 索引优化应该是最查询性能优化的最有效的手段了,索引能够轻易将查询性能提高好几个数量级. 索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则要从几百页中逐页去查. 索引优缺点 优点 加快访问速度 加强行的唯一性 缺