mysql 存储过程 存储函数 游标 事件 视图

 mysqldump 备份还原表

1.导出所有(包括结构&数据&存储过程&函数&事件&触发器)(不写-R -E默认仅导出结构和数据)

-- 注意这里不要加分号(密码随后输入即可)
mysqldump -h192.168.2.252 -uroot -p -R -E ipvacloud > d:2.sql  

2.导入数据库

mysql>use voice;
mysql>source d:xxx.sql;
再次出现mysql>并且没有提示错误即还原成功

这里为什么要用mysqldump呢?  因为速度快啊,数据库5个G用它比直接用navicat导出sql文件快100倍, 原来,mysqldump默认导出的就有table和view,而且view还是作为temp table导出来的,而且在导出来的sql文件里面,你看不到create view这样类似的字眼。但是,你执行source 2.sql命令时,会在视图里找到aaa这个视图

1.存储过程

CREATE DEFINER=`root`@`%` PROCEDURE `test_procedure`(IN `age` int,OUT `result_out` int)
BEGIN
    DECLARE user_name VARCHAR (64) -- 声明变量,但不使用
	#Routine body goes here...
  SELECT * FROM employee; -- 返回结果集
	SET result_out=age *2; -- out结果
	END

点击运行按钮,只要输入输入参数就可以啦

--navicat中使用call来调用 存储过程  1个输入参数, 1个输出参数

CALL test_procedure(6, @a);

2.存储函数(必须要有返回值,且入参只有IN, 没有OUT)

CREATE DEFINER=`root`@`%` FUNCTION `test_function`(`age` int) 
RETURNS int(11)  -- 表示返回值的类型
BEGIN
	RETURN age * 2;
END

navicat中使用如下语句,调用存储函数

SELECT test_function(22);

3.游标 

MySql 游标的使用(二)FETCH INTO取出来的部分字段为NULL-CSDN博客

BEGIN
 -- 这里定义的变量不能和表字段相同(重点)
 DECLARE uid VARCHAR(100);
 DECLARE subuid VARCHAR(100);
 DECLARE create_name VARCHAR(256);-- 上两级用户username
 DECLARE ss VARCHAR(256);
 declare t_node int; 
 DECLARE done INT DEFAULT 0; 

 DECLARE curJob CURSOR FOR ( -- 为临时表创建游标 定义游标映射的表的字段要和FETCH curJob INTO uid, create_user_name;的字段一致
      SELECT UserId, create_user_name FROM user_temp  
 );

 DECLARE curJob1 CURSOR FOR ( 
      SELECT UserId FROM sub_user_temp 
 );
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 监听器在游标定义的后面(只声明一次)

-- delcare完就开启事务 定义handler来处理异常
declare exit handler for sqlexception select concat('失败:',case t_node when 1 then '失败' when 2 then '失败' end);ROLLBACK;

CREATE TEMPORARY TABLE  IF NOT EXISTS user_temp(
   UserId varchar(100),
   create_user_name varchar(256)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



-- 创建临时表必须在声明异常的下面
start TRANSACTION; -- 和下面的COMMIT对应
-- 将查询的结果放到临时表里
INSERT INTO user_temp SELECT am.UserId,au.create_user_name FROM aspnet_Membership am INNER JOIN aspnet_users au ON am.UserId=au.UserId WHERE customer_status='3';

OPEN curJob; -- 打开游标  
    out_loop:LOOP   -- loop名称可以是out_loop inner_loop
        FETCH curJob INTO uid, create_name;
        IF done=1 THEN LEAVE out_loop;END IF;
        -- 存放子用户信息的临时表
				CREATE TEMPORARY TABLE  IF NOT EXISTS sub_user_temp(
					 UserId varchar(50) NOT NULL
				) ENGINE=InnoDB DEFAULT CHARSET=utf8;

        INSERT INTO sub_user_temp SELECT UserId FROM aspnet_users WHERE create_user_name in (SELECT UserName FROM aspnet_users WHERE UserId=uid);

				SELECT COUNT(1) INTO ss FROM sub_user_temp;
        IF(ss > 0) THEN   -- 存在子用户则将子用户挂在上二级用户username下,然后直接删除
						OPEN curJob1; -- 打开游标
						inner_loop:LOOP  
								FETCH curJob1 INTO subuid;
								IF done=1 THEN LEAVE inner_loop;END IF;
				
                -- 遍历多个子用户,update为此用户的create_user_name为上两级用户的name即可
                UPDATE aspnet_users SET create_user_name=create_name WHERE UserId=subuid;
						END LOOP inner_loop;   
					CLOSE curJob1;

				  DROP TABLE sub_user_temp; -- 删除临时表
          SET done = 0; -- 注意这里(重点)
        END IF;

    END LOOP out_loop;   
CLOSE curJob; -- 关闭游标  


COMMIT; 
END

4.事件

mysql事件 定时调用存储过程备份历史数据

 

  事件 调用 该存储过程  每天早8点定时执行备份近7天的天客流数据

SET GLOBAL event_scheduler = ON;
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;

两种事件类型,一个是间隔触发,另一个是特定事件触发(我们用这种,特定时间触发)。
事件定时任务跟触发器很像,都是被动执行的,事件是因为时间到了触发执行,而触发器是因为某件事件(增删改)触发执行;
Create Database  If Not Exists MyDB Character Set UTF8;  即使是MyDB大写库名也是小写

真实的开发环境中,会遇到mysql服务重启或者断电的情况,此时则会出现事件调度器被关闭的情况,所有事件都不在起作用,要想解决这个办法,则需要在mysql.ini文件中加入event_scheduler = ON; 的语句

DEFINER:创建者;

ON COMPLETION [NOT] PRESERVE :表示当事件不会再发生的情况下,删除事件(注意特定时间执行的事件,如果设置了该参数,执行完毕后,事件将被删除,不想删除的话可以设置成ON COMPLETION PRESERVE);

ENABLE:表示系统将执行这个事件;
begin和end之间(包括begin和end)写成一个存储过程,让事件调用这个存储过程  


DROP EVENT IF EXISTS `event_minute`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` EVENT `event_minute` ON SCHEDULE EVERY 1 MINUTE STARTS '2018-01-02 08:00:00' ON COMPLETION NOT PRESERVE ENABLE DO 

BEGIN
    INSERT INTO USER(name, address,addtime) VALUES('test1','test1',now());
END
;;
DELIMITER ;

5.视图

CREATE VIEW view_name as SELECT * FROM person