存储过程Stored Procedur是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行,数据库 SQL 语言层面的代码封装与重用。
触发器trigger是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发 insert,delete, update)而被执行的。
计划任务,即事件调度器(Event Scheduler),可以用做定时执行某些特定任务,精确到秒。
一、存储过程
1、数据表结构
![](https://img.haomeiwen.com/i24447700/8fe30681455d09f7.png)
2、创建存储过程生成1000万行数据,本文是利用phpmyadmin来可视化建立,也可以在命令行输入来建立。
DROP PROCEDURE IF EXISTS proc1;
DELIMITER $$
SET AUTOCOMMIT = 0$$
CREATE PROCEDURE proc1()
BEGIN
DECLARE v_cnt DECIMAL(10) DEFAULT 0 ;
dd:LOOP
INSERT INTO card (card_number) VALUES(UUID());
COMMIT;
SET v_cnt = v_cnt+1 ;
IF v_cnt = 10000000 THEN LEAVE dd;
END IF;
END LOOP dd ;
END;$$
DELIMITER ;
![](https://img.haomeiwen.com/i24447700/b47193774fea2f8a.png)
3、执行call proc1,看电脑性能,笔者使用了3分20秒。
![](https://img.haomeiwen.com/i24447700/03227702f745de56.png)
二、触发器
再建立一个同样结构的表card_old,在删除表card的数据后会将数据插入到表card_old,保存删除的数据。触发器使通过事件触发而被执行的,当对一个表进行操作DML操作( insert,delete, update)时就会激活它执行。可以使用old和new来引用触发器中发生变化的记录内容。
本文时使用的phpmyadmin来可视化建立触发器,也可以通过使用Navicat for MySQL创建触发器,也可以使用命令行来建立。
create trigger trash
after insert on card for each row
begin
insert into card_old (card_id, card_number) values( old.card_id, old.card_number)
end;
![](https://img.haomeiwen.com/i24447700/70e3a4ca37fbcf5d.png)
三、计划任务
mysql schedule可以很灵活地去控制任务,本文是每隔一秒(运行周期可设)插入数据,计划任务可以定时调用存储过程来完成一系列sql集合。
计划任务需要设置开关才会失效 SET GLOBAL event_scheduler="ON" 。
![](https://img.haomeiwen.com/i24447700/36715b8b4ecb9d2b.png)
命令行创建计划任务:
create event test1
on schedule every 1 day
starts '2021-01-01 12:00:00'
on completion not preserve
do INSERT INTO card (card_number) VALUES (UUID());
网友评论