日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间

發(fā)布時(shí)間:2023/11/29 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??

??? 由于項(xiàng)目需要?jiǎng)?chuàng)建定時(shí)器(evevt),所以就百度了一下,發(fā)現(xiàn)基本都是來(lái)源于一個(gè)模板,有些功能還不全,現(xiàn)在自己總結(jié)一下。

注:mysql版本是從5.1開(kāi)始才支持event的。如果你的版本低于5.1就先升級(jí)版本吧。

查看版本的方法有很多,這里只給大家提供一個(gè)??? select version();

1.查看是否開(kāi)啟evevt與開(kāi)啟evevt。

1.1、MySQL evevt功能默認(rèn)是關(guān)閉的,可以使用下面的語(yǔ)句來(lái)看evevt的狀態(tài),如果是OFF或者0,表示是關(guān)閉的。

????????????? show VARIABLES LIKE '%sche%';

1.2、開(kāi)啟evevt功能

??????????? SET GLOBAL event_scheduler = 1;

2.創(chuàng)建定時(shí)器的過(guò)程

2.1、創(chuàng)建測(cè)試表test
drop table if exists test;
create table test
(
id int(11) not null auto_increment primary key,
time datetime not null
) engine=innodb default charset=utf8;

2.2、創(chuàng)建evevt要調(diào)用的存儲(chǔ)過(guò)程test_proce
delimiter //
drop procedure if exists test_proce//
create procedure test_proce()
begin
insert into test(time) values(now());
end//
delimiter ;

2.3、開(kāi)啟evevt(要使定時(shí)起作用,MySQL的常量GLOBAL event_scheduler必須為on或者是1)
執(zhí)行show variables like 'event_scheduler';查看evevt是否開(kāi)啟;
若沒(méi)開(kāi)啟執(zhí)行set global event_scheduler='on';

2.4、創(chuàng)建事件test_event(其作用:每隔一秒自動(dòng)調(diào)用test_proce()存儲(chǔ)過(guò)程)
drop event if exists test_event;
create event test_event
on schedule every 1 second
on completion preserve disable
do call test_proce();
2.5、開(kāi)啟事件test_event
alter event test_event on completion preserve enable;
2.6、關(guān)閉事件test_event
alter event test_event on completion preserve disable;
2.7、查看表test
select * from test;

?

3.查看自己創(chuàng)建的event

如果要查看更加詳細(xì)的信息,你需要root用戶的授權(quán),如果是你自己的數(shù)據(jù)庫(kù)你可以用下面語(yǔ)句查看

select * from? mysql.event;

下面的我的evevt的查看結(jié)果



4.event的時(shí)間設(shè)置

設(shè)置event很簡(jiǎn)單,但是麻煩的是如何設(shè)置執(zhí)行的時(shí)間,網(wǎng)上找了一些,自己總結(jié)了一下。

先看語(yǔ)句,如下面這個(gè)

???? CREATE EVENT test_event ON SCHEDULE EVERY 1 DAY STARTS '2012-09-24 00:00:00'

???? ON COMPLETION PRESERVE ENABLE DO CALL test_procedure();

EVERY 后面的是時(shí)間間隔,可以選 1 second,3 minute,5 hour,9 day,1 month,1 quarter(季度),1 year?

從2013年1月13號(hào)0點(diǎn)開(kāi)始,每天運(yùn)行一次

ON SCHEDULE EVERY 1 DAY STARTS '2013-01-13 00:00:00'

從現(xiàn)在開(kāi)始每隔九天定時(shí)執(zhí)行

ON SCHEDULE EVERY 9 DAY?STARTS NOW()?;

每個(gè)月的一號(hào)凌晨1 點(diǎn)執(zhí)行

on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);

每個(gè)季度一號(hào)的凌晨1點(diǎn)執(zhí)行

on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);

每年1月1號(hào)凌晨1點(diǎn)執(zhí)行

on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);

?

其他的 就大家自由組合了。。

?

?

附錄

?

1>使用權(quán)限

單獨(dú)使用event調(diào)用SQL語(yǔ)句時(shí),查看和創(chuàng)建需要用戶具有event權(quán)限,調(diào)用該SQL語(yǔ)句時(shí),需要用戶具有執(zhí)行該SQL的權(quán)限。Event權(quán)限的設(shè)置保存在mysql.user表和mysql.db表的Event_priv字段中。

當(dāng)event和procedure配合使用的時(shí)候,查看和創(chuàng)建存儲(chǔ)過(guò)程需要用戶具有create routine權(quán)限,調(diào)用存儲(chǔ)過(guò)程執(zhí)行時(shí)需要使用excute權(quán)限,存儲(chǔ)過(guò)程調(diào)用具體的SQL語(yǔ)句時(shí),需要用戶具有執(zhí)行該SQL的權(quán)限。

?

查看EVENT命令有如下幾種:

?

(1)查詢mysql.event表;

(2)通過(guò)SHOW EVENTS命令;

(3)通過(guò)SHOW FULL EVENTS命令;

(4)通過(guò)查詢information_schema.events表

(5)SHOW CREATE EVENT。

總之,event的使用頻率較低建議使用root用戶進(jìn)行創(chuàng)建和維護(hù)。

?

2>CREATE EVENT 的語(yǔ)法

CREATE EVENT

[IF NOT EXISTS] ------------------------------------------------*標(biāo)注1

event_name -----------------------------------------------------*標(biāo)注2

ON SCHEDULE schedule -------------------------------------------*標(biāo)注3?

[ON COMPLETION [NOT] PRESERVE] ---------------------------------*標(biāo)注4

[ENABLE | DISABLE] ---------------------------------------------*標(biāo)注5?

[COMMENT 'comment'] --------------------------------------------*標(biāo)注6?

DO sql_statement ;----------------------------------------------*標(biāo)注7

?

說(shuō)明:

標(biāo)注1:[IF NOT EXISTS]

?????? 使用IF NOT EXISTS,只有在同名event不存在時(shí)才創(chuàng)建,否則忽略。建議不使用以保證event創(chuàng)建成功。

?

標(biāo)注2:event_name

????? 名稱最大長(zhǎng)度可以是64個(gè)字節(jié)。名字必須是當(dāng)前Dateabase中唯一的,同一個(gè)數(shù)據(jù)庫(kù)不能有同名的event。

????? 使用event常見(jiàn)的工作是創(chuàng)建表、插入數(shù)據(jù)、刪除數(shù)據(jù)、清空表、刪除表。

??????為了避免命名規(guī)范帶來(lái)的不便,最好讓事件名稱具有描述整個(gè)事件的能力。建議命名規(guī)則如下為:

????? 動(dòng)作名稱_(INTO/FROM_)? 表名_TIME,例如:

?????????????????????????????????????????????? 1.每月創(chuàng)建(清空/刪除)fans表:?

???????????????????????????????????????????????????????????????????????? create(truncate/drop)_table_fans_month;

?????????????????????????????????????????????? 2.每天從fans表插入(刪除)數(shù)據(jù):?

?????????????????????????????????????????????????????????????????????????insert(delete)_into(from)_fans_day;

?

標(biāo)注3:ON SCHEDULE

???????ON SCHEDULE 計(jì)劃任務(wù),有兩種設(shè)定計(jì)劃任務(wù)的方式:

?????? 1. AT 時(shí)間戳,用來(lái)完成單次的計(jì)劃任務(wù)。

?????? 2. EVERY 時(shí)間(單位)的數(shù)量時(shí)間單位[STARTS 時(shí)間戳] [ENDS時(shí)間戳],用來(lái)完成重復(fù)的計(jì)劃任務(wù)。

?

?????? 在兩種計(jì)劃任務(wù)中,時(shí)間戳可以是任意的TIMESTAMP 和DATETIME 數(shù)據(jù)類型,時(shí)間戳需要大于當(dāng)前時(shí)間。

???????在重復(fù)的計(jì)劃任務(wù)中,時(shí)間(單位)的數(shù)量可以是任意非空(Not Null)的整數(shù)式.

?????? 時(shí)間單位是關(guān)鍵詞:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。

???????提示: 其他的時(shí)間單位也是合法的如:

???????? QUARTER, WEEK,YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND

????????????????? 不建議使用上一行這些不標(biāo)準(zhǔn)的時(shí)間單位。

?

標(biāo)注4: [ON COMPLETION [NOT] PRESERVE]

????????ON COMPLETION參數(shù)表示"當(dāng)這個(gè)事件不會(huì)再發(fā)生的時(shí)候",即當(dāng)單次計(jì)劃任務(wù)執(zhí)行完畢后或當(dāng)重復(fù)性的計(jì)劃任務(wù)執(zhí)行到了ENDS階段。而PRESERVE的作用是使事件在執(zhí)行完畢后不會(huì)被Drop掉,建議使用該參數(shù),以便于查看EVENT具體信息。

?

標(biāo)注5:[ENABLE | DISABLE]

?????? 參數(shù)Enable和Disable表示設(shè)定事件的狀態(tài)。Enable表示系統(tǒng)將執(zhí)行這個(gè)事件。Disable表示系統(tǒng)不執(zhí)行該事件。

???????? 可以用如下命令關(guān)閉或開(kāi)啟事件:

???????????????????????????????????? ALTER EVENT event_name ?ENABLE/DISABLE

?

標(biāo)注6:[COMMENT 'comment']

??????? 注釋會(huì)出現(xiàn)在元數(shù)據(jù)中,它存儲(chǔ)在information_schema表的COMMENT列,最大長(zhǎng)度為64個(gè)字節(jié)。

??????? 'comment'表示將注釋內(nèi)容放在單引號(hào)之間,建議使用注釋以表達(dá)更全面的信息。

?

標(biāo)注7: DO sql_statement

??????? DO sql_statement字段表示該event需要執(zhí)行的SQL語(yǔ)句或存儲(chǔ)過(guò)程。

??????? 這里的SQL語(yǔ)句可以是復(fù)合語(yǔ)句,例如:

????????????????????????????????????????? ?BEGIN

????????????????????????????????????????? ?CREATE TABLE test1;//創(chuàng)建表(需要測(cè)試一下)

??????????????????????????????????????? ?? DROP TABLE test2;//刪除表

????????????????????????????????????????? ?CALL proc_test1();//調(diào)用存儲(chǔ)過(guò)程

??????????????????????????????????????? ???END

使用BEGIN和END標(biāo)識(shí)符將復(fù)合SQL語(yǔ)句按照?qǐng)?zhí)行順序放在之間。當(dāng)然SQL語(yǔ)句是有限制的,對(duì)它的限制跟函數(shù)Function和觸發(fā)器Trigger 中對(duì)SQL語(yǔ)句的限制是一樣的,如果你在函數(shù)Function 和觸發(fā)器Trigger 中不能使用某些SQL,同樣的在EVENT中也不能使用。明確的來(lái)說(shuō)有下面幾個(gè):

?????????????????? ?????? LOCK TABLES

????????????????????? ??? UNLOCK TABLES

????????????????????????? CREATE EVEN

????????????????????????? ALTER EVENT

????????????????????????? LOAD DATA

?

3>執(zhí)行邏輯

For (已建立事件each event that has been created)

If (事件的狀態(tài)非DISABLE)

And (當(dāng)前時(shí)間在ENDS時(shí)間之前)

And (當(dāng)前時(shí)間在STARTS時(shí)間之后)

And (在上次執(zhí)行后經(jīng)過(guò)的時(shí)間)

And (沒(méi)有被執(zhí)行)

Then:

建立一個(gè)新的線程

傳遞事件的SQL語(yǔ)句給新的線程

(該線程在執(zhí)行完畢后會(huì)自動(dòng)關(guān)閉)

?

4>修改事件

?

使用ALTER EVENT 來(lái)修改事件,具體的ALTER語(yǔ)法如下,與創(chuàng)建事件的語(yǔ)法類似:

ALTER EVENT?? event_name

ON SCHEDULE schedule

[RENAME TO new_event_name]

[ON COMPLETION [NOT] PRESERVE]

[ENABLE | DISABLE]

[COMMENT 'comment']

DO sql_statement;

?

5>刪除事件

?

EVENT使用DROP EVENT語(yǔ)句來(lái)刪除已經(jīng)創(chuàng)建的事件,語(yǔ)法如下:

DROP EVENT? [IF EXISTS]? event_name;

?

但當(dāng)一個(gè)事件正在運(yùn)行中時(shí),刪除該事件不會(huì)導(dǎo)致事件停止,事件會(huì)執(zhí)行到完畢為止。使用DROP USER和DROP DATABASE 語(yǔ)句同時(shí)會(huì)將包含其中的事件刪除。

?

show procedure status;

?

MYSQL中存儲(chǔ)過(guò)程的創(chuàng)建,調(diào)用及語(yǔ)法

(2011-12-01 16:19:46)

轉(zhuǎn)載▼

MySQL 存儲(chǔ)過(guò)程是從 MySQL 5.0 開(kāi)始增加的新功能。存儲(chǔ)過(guò)程的優(yōu)點(diǎn)有一籮筐。不過(guò)最主要的還是執(zhí)行效率和SQL 代碼封裝。特別是 SQL 代碼封裝功能,如果沒(méi)有存儲(chǔ)過(guò)程,在外部程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí)(例如 PHP),要組織很多 SQL 語(yǔ)句。特別是業(yè)務(wù)邏輯復(fù)雜的時(shí)候,一大堆的 SQL 和條件夾雜在 PHP 代碼中,讓人不寒而栗?,F(xiàn)在有了 MySQL 存儲(chǔ)過(guò)程,業(yè)務(wù)邏輯可以封裝存儲(chǔ)過(guò)程中,這樣不僅容易維護(hù),而且執(zhí)行效率也高。

?

第一部分:創(chuàng)建一個(gè)簡(jiǎn)單的無(wú)參的存儲(chǔ)過(guò)程

1 用mysql客戶端登入

2 選擇數(shù)據(jù)庫(kù)

mysql>use test;

3 查詢當(dāng)前數(shù)據(jù)庫(kù)有哪些存儲(chǔ)過(guò)程

mysql>show procedure status where Db='test'; 4 創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程 mysql>create procedure hi() select 'hello'; 5 存儲(chǔ)過(guò)程創(chuàng)建完畢,看怎么調(diào)用它 mysql>call hi();   顯示結(jié)果   mysql> call hi(); +-------+ | hello | +-------+ | hello | +-------+ 1 row in set (0.00 sec)Query OK, 0 rows affected (0.01 sec) 6 一個(gè)簡(jiǎn)單的儲(chǔ)存過(guò)程就成功了,這只是一個(gè)演示,存儲(chǔ)過(guò)程可以一次執(zhí)行多個(gè)sql語(yǔ)句第二部分:創(chuàng)建一個(gè)有兩個(gè)參數(shù)的存儲(chǔ)過(guò)程一、MySQL 創(chuàng)建存儲(chǔ)過(guò)程 “pr_add” 是個(gè)簡(jiǎn)單的 MySQL 存儲(chǔ)過(guò)程,這個(gè)存儲(chǔ)過(guò)程有兩個(gè) int 類型的輸入?yún)?shù) “a”、“b”,返回這兩個(gè)參數(shù)的和。 drop procedure if exists pr_add;-- 計(jì)算兩個(gè)數(shù)之和create procedure pr_add(a int,b int) begin ? ?declare c int;if a is null thenset a = 0;end if;if b is null thenset b = 0;end if;set c = a + b;select c as sum; ? ?end; 二、調(diào)用 MySQL 存儲(chǔ)過(guò)程 call pr_add(10, 20); 執(zhí)行 MySQL 存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程參數(shù)為 MySQL 用戶變量。 set @a = 10;set @b = 20;call pr_add(@a, @b);三、MySQL 存儲(chǔ)過(guò)程特點(diǎn) 創(chuàng)建 MySQL 存儲(chǔ)過(guò)程的簡(jiǎn)單語(yǔ)法為: create procedure 存儲(chǔ)過(guò)程名字()([in|out|inout] 參數(shù) datatype )beginMySQL 語(yǔ)句;end;MySQL 存儲(chǔ)過(guò)程參數(shù)如果不顯式指定“in”、“out”、“inout”,則默認(rèn)為“in”。習(xí)慣上,對(duì)于是“in” 的參數(shù),我們都不會(huì)顯式指定。 1. MySQL 存儲(chǔ)過(guò)程名字后面的“()”是必須的,即使沒(méi)有一個(gè)參數(shù),也需要“()” 2. MySQL 存儲(chǔ)過(guò)程參數(shù),不能在參數(shù)名稱前加“@”,如:“@a int”。下面的創(chuàng)建存儲(chǔ)過(guò)程語(yǔ)法在 MySQL 中是錯(cuò)誤的(在 SQL Server 中是正確的)。 MySQL 存儲(chǔ)過(guò)程中的變量,不需要在變量名字前加“@”,雖然 MySQL 客戶端用戶變量要加個(gè)“@”。 create procedure pr_add(@a int,??-- 錯(cuò)誤b int? ? -- 正確)3. MySQL 存儲(chǔ)過(guò)程的參數(shù)不能指定默認(rèn)值。 4. MySQL 存儲(chǔ)過(guò)程不需要在 procedure body 前面加 “as”。而 SQL Server 存儲(chǔ)過(guò)程必須加 “as” 關(guān)鍵字。 create procedure pr_add(a int,b int)as? ?? ?? ?? ???-- 錯(cuò)誤,MySQL 不需要 “as”beginmysql statement ...;end;5. 如果 MySQL 存儲(chǔ)過(guò)程中包含多條 MySQL 語(yǔ)句,則需要 begin end 關(guān)鍵字。 create procedure pr_add(a int,b int)beginmysql statement 1 ...;mysql statement 2 ...;end;6. MySQL 存儲(chǔ)過(guò)程中的每條語(yǔ)句的末尾,都要加上分號(hào) “;” ? ?...declare c int;if a is null thenset a = 0;end if;...end;7. MySQL 存儲(chǔ)過(guò)程中的注釋。 declare c int;? ???-- 這是單行 MySQL 注釋 (注意 -- 后至少要有一個(gè)空格)if a is null then??# 這也是個(gè)單行 MySQL 注釋set a = 0;end if;...end;8. 不能在 MySQL 存儲(chǔ)過(guò)程中使用 “return” 關(guān)鍵字。 ? ?set c = a + b;select c as sum;end;9. 調(diào)用 MySQL 存儲(chǔ)過(guò)程時(shí)候,需要在過(guò)程名字后面加“()”,即使沒(méi)有一個(gè)參數(shù),也需要“()” call pr_no_param(); 10. 因?yàn)?MySQL 存儲(chǔ)過(guò)程參數(shù)沒(méi)有默認(rèn)值,所以在調(diào)用 MySQL 存儲(chǔ)過(guò)程時(shí)候,不能省略參數(shù)。可以用 null 來(lái)替代。 call pr_add(10, null);

轉(zhuǎn)載于:https://my.oschina.net/lwaif/blog/821853

總結(jié)

以上是生活随笔為你收集整理的mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。