前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL 系列教程之(十二)扩展了解 MySQL 的存储过程,视图,触发器

MySQL 系列教程之(十二)扩展了解 MySQL 的存储过程,视图,触发器

原创
作者头像
ruochen
修改2021-08-18 10:33:52
1K0
修改2021-08-18 10:33:52
举报

存储过程

Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,在需要时直接调用 存储过程就像脚本语言中函数定义一样

代码语言:txt
复制
-- 定义存储过程
\d //
create procedure p1()
begin
set @i=10;
while @i<90 do
insert into users values(null,concat('user:',@i),concat('user:',@i,'@qq.com'),concat('137013730',@i));
set @i=@i+1;
end while;
end;
//

执行储存:call p1()

查看存储具体信息:show create procedure p1\G

删除触发器: drop procedure p1

应用场景:

代码语言:txt
复制
假设表中有千万条数据,在业务端需要进行分页显示,那么通常情况下是使用limit方式来完成,
代码语言:txt
复制
但是会不会出现 limit 9000000,10,这样做也没毛病
代码语言:txt
复制
此时还可以借助存储过程和游标来实现,在存储过程中去定义并使用游标来获取指定的数据

MySQL的触发器

提前定义好一个或一组操作,在指定的sql操作前或后来触发指定的sql执行 举例: 定义一个update语句,在向某个表中执行insert添加语句时来触发执行,就可以使用触发器 触发器就是javascript中的事件一样

格式:1、触发器的定义:

代码语言:txt
复制
 CREATE TRIGGER trigger_name trigger_time trigger_event
   ON tbl_name FOR EACH ROW trigger_stmt
说明:
# trigger_name:触发器名称
# trigger_time:触发时间,可取值:BEFORE或AFTER
# trigger_event:触发事件,可取值:INSERT、UPDATE或DELETE。
# tb1_name:指定在哪个表上
# trigger_stmt:触发处理SQL语句。

-- 查看所有的 触发器
show triggers\G;

-- 删除触发器
drop trigger trigger_name;

触发器Demo

注意:如果触发器中sql有语法错误,那么整个操作都会报错

代码语言:txt
复制
-- 创建一个删除的触发器,在users表中删除数据之前,往del_users表中添加一个数据

-- 1,复制当前的一个表结构
create table del_users like users;

-- 2,创建 触发器 注意在创建删除触发器时,只能在删除之前才能获取到old(之前的)数据
\d //
create trigger deluser before delete on users for each row
begin
insert into del_users values(old.uid,old.uname,old.email,old.phone);
end;
//
\d ;

-- 3 删除users表中的数据去实验

用触发器来实现数据的统计

代码语言:txt
复制
-- 1.创建一个表, users_count 里面有一个 num的字段 初始值为0或者是你当前users表中的count

-- 2,给users表创建一个触发器
-- 当给users表中执行insert添加数据之后,就让users_count里面num+1,
-- 当users表中的数据删除时,就让users_count里面num-1,
-- 想要统计users表中的数据总数时,直接查看 users_count

Mysql中的视图

视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

视图仅仅是用来查看存储在别处的数据的一种设施或方法。

视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的。

在添加或更改这些表中的数据时,视图将返回改变过的数据。

因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。

如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能下降得很厉害。

视图的作用:

1.重用SQL语句。

2.简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。

3.使用表的组成部分而不是整个表。

4.保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。

5.更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。

注意:视图不能索引,也不能有关联的触发器或默认值。

代码语言:txt
复制
创建视图:
mysql> create view v_t1 as select * from t1 where id>4 and id<11;
Query OK, 0 rows affected (0.00 sec)

view视图的帮助信息:
mysql> ? view
ALTER VIEW
CREATE VIEW
DROP VIEW

查看当前库中所有的视图
show tables; --可以查看到所有的表和视图
show table status where comment='view'; --只查看当前库中的所有视图

删除视图v_t1:
mysql> drop view v_t1;

mysql 数据库备份与恢复

配置mysql的bin log日志

在windows中找到 my.ini 配置文件,在mysqld的配置项配置

server_id=123456

log_bin = mysql-bin

binlog_format = ROW

ubuntu:

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

server-id = 123456

log_bin = /var/log/mysql/mysql-bin

配置完成后重启mysql服务

进入mysql中

代码语言:txt
复制
-- 重置binlog日志
reset master;
-- 查看当前的所有日志 
show binary logs;

-- 创建数据库
create database ops;


-- 选择并打开库
use ops;


-- 创建表
create table user(
    id int not null auto_increment,
    name char(20) not null,
    age int not null,
    primary key(id)
)engine=InnoDB;


-- 添加数据
insert into user values(1,"wangbo","24"),(2,"guohui","22"),(3,"zhangheng","27");

-- 查询
select *  from user;
+----+-----------+-----+
| id | name      | age |
+----+-----------+-----+
|  1 | wangbo    |  24 |
|  2 | guohui    |  22 |
|  3 | zhangheng |  27 |
+----+-----------+-----+


-- 现在进行数据备份
mysqldump -uroot -p -B -F -R -x --master-data=2 ops >F:\mysql-5.7.27-winx64\bf\ops.sql

-----------------
参数说明:
-B:指定数据库
-F:刷新日志
-R:备份存储过程等
-x:锁表
--master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息



-- 再添加新的数据
insert into user values(4,"liupeng","21"),(5,"xiaoda","31"),(6,"fuaiai","26");

-- 查询数据
mysql> select * from user;
+----+-----------+-----+
| id | name      | age |
+----+-----------+-----+
|  1 | wangbo    |  24 |
|  2 | guohui    |  22 |
|  3 | zhangheng |  27 |
|  4 | liupeng   |  21 |
|  5 | xiaoda    |  31 |
|  6 | fuaiai    |  26 |
+----+-----------+-----+



-- 此时误操作,删除了test数据库
drop database ops;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| python4            |
| sys                |
| wx                 |
+--------------------+



1,先讲binlog文件导出
-- 将binlog文件导出sql文件,并vim编辑它删除其中的drop语句
mysqlbinlog F:\mysql-5.7.27-winx64\data\mysql-bin.000002>>F:\mysql-5.7.27-winx64\bf\002bin.sql



2,-- 删除里面的drop语句
vim 002bin.sql

3,-- 导入备份的数据文件,
mysql -uroot -p < F:\mysql-5.7.27-winx64\bf\ops.sql 

4,-- 再导入删除 drop语句后的 binlog日志文件
mysql -uroot -p ops < F:\mysql-5.7.27-winx64\bf\002bin.sql

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 存储过程
  • MySQL的触发器
  • Mysql中的视图
  • mysql 数据库备份与恢复
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档