Delete record with Event Scheduler - mysql

Just wanted to ask if this Event Scheduler works, also if once ran, it will continue to run as long as mySQL is running as a service?
SET GLOBAL event_scheduler = ON;
CREATE EVENT deleteVistors
ON SCHEDULE EVERY 1 DAY STARTS'2013-08-13 04:00:00'
DO
DELETE FROM tblwhitelist WHERE description = 'Vistors';
Also would this need a delimiter? I'm still unsure to what it actually is!
Hope you can help!

http://dev.mysql.com/doc/refman/5.1/en/create-event.html
Not using ENDS means that the event continues executing indefinitely.
CREATE EVENT deleteVistors
ON SCHEDULE EVERY 1 DAY STARTS '2013-08-13 04:00:00'
-- !!! no *END*: will continue until you explicitly drop the event
DO
DELETE FROM tblwhitelist WHERE description = 'Vistors';
For the second question:
Also would this need a delimiter?
MySQL use the semi-colon as statement delimiter. For multi-line statements (BEGIN ... END, etc.) this could be confusing for your MySQL client as the ; might appears inside those multi-line statements.
Here, you have only one ; so you don't have to bother with that.

Related

Issue setting event to clear columns in my sql

I am trying to create an event (ClearTimes) in a mysql database (edata), to run every 24 hrs at 11pm, that clears 2 columns (Shift, Lunchtime). This is what I typed to create the event:
DELIMITER $$
CREATE
EVENT `ClearTimes`
ON SCHEDULE EVERY 1 DAY STARTS '2015-12-05 23:00:00'
DO BEGIN
-- clear "Shift" column
UPDATE edata SET shift = '';
-- clear "Lunchtimes" column
UPDATE edata SET Lunchtime = '';
END $$
DELIMITER ;
The issue is that the event ran on the 5th at 11pm, and then never ran again. I of course want the event to run every 24 hours # 11pm. Any Ideas?
Finally after all this time I figured out the issue, some one was running a restart on the computer for updates so the pc was never on when it was trying to clear... changed the time and it has been working great.
Sorry for the confusion.

What is wrong with my syntax when creating an event? phpmyadmin

I have been at this for hours now, and I have tried everything I could find on stackoverflow and the internet. Nothing has worked. I have tried entering the code directly in the SQL prompt on phpmyadmin, as well as tried to create the event in the events tab.
For some odd reason, when giving it a second command, I get a syntax error. Each command on its own is accepted just fine. Together though? Syntax error.
Here's the code.
CREATE EVENT update_stats
ON SCHEDULE EVERY 15 MINUTE
ON COMPLETION PRESERVE ENABLE
DO
BEGIN
UPDATE stats JOIN temp_stats ON stats.unique_key = temp_stats.unique_key
SET stats.clicks = stats.clicks + temp_stats.clicks;
TRUNCATE temp_stats;
END
This yields a syntax error. I found a similar question on stackoverflow (see below) but none of the solutions worked. Yes, I tried setting and using a different delimiter. I even updated phpmyadmin to 4.4.1. Nothing works, just says I have a syntax error. I'm at my wits end here. MySQL 5.6.17.
phpmyadmin|How to create an event do 2 actions
I think this answer is missing an explanation as Jean-Francois was the correct answer but I didn't get it to work until I worked out what the "Delimiter" is.
When sending commands to SQL they are separated with a "Delimiter" the default is ";"
When I was making my event, inside the "CREATE EVENT" statement contains SQL queries inside the "BEGIN" and "END". SO MYSQL, parsing the query, runs into a ';' inside the BEGIN statement and correctly ends the statement there, saying "error in syntax near '' at line X" (the line it found the semi-colon on).
So to get around this you have to change the default delimiter for parsing, then run the query so you can include SQL statements inside your CREATE EVENT query with it ignoring the semi-colon and set the default delimiter back to a semi-colon:
DELIMITER $$
CREATE EVENT `snap_extcrs`
ON SCHEDULE
EVERY 1 DAY STARTS '2020-04-17 23:59:59'
ON COMPLETION PRESERVE
ENABLE
COMMENT ''
DO
BEGIN
INSERT INTO table (field, field2)
SELECT 1, 2 FROM table2
WHERE
date = DATE(NOW());
INSERT INTO table3 (field, field2)
SELECT 1, 2 FROM table2
WHERE
date = DATE(NOW());
END$$
DELIMITER ;
You forgot to put the END delimiter
DELIMITER #
CREATE EVENT update_stats
ON SCHEDULE
EVERY 15 MINUTE
ON COMPLETION PRESERVE ENABLE
DO BEGIN
UPDATE stats JOIN temp_stats ON stats.unique_key = temp_stats.unique_key
SET stats.clicks = stats.clicks + temp_stats.clicks;
TRUNCATE temp_stats;
END#
DELIMITER ;

MySql Schedule event

I want to insert data in a table at the beginning of every month, I though to use mysql event. But someone told me that if I miss that event (Mean if my server is down in scheduled date/time then mysql will no rerun that event after getting online, not sure) then mysql will not rerun it again.
So I have created a table celled event_balance where event will be logged. Then I created a event called balance_update_check which will run every hour and check if event was executed for this month, if not then it will call a procedure which will create rows for this month and then update table event_balance with event_type and date.
But I am not satisfied with this, please check my codes and tell me is it OK? if possible provide a better solution. Thanks for you time.
Event balance_update_check
CREATE
EVENT `balance_update_check`
ON SCHEDULE EVERY 1 Hour
DO BEGIN
set #check_if_cont_doc:= (SELECT count(*) FROM event_balance WHERE event_type = 'doctor_contract' and monthname(event_balance.date) = monthname(CURDATE()));
set #check_if_cont_other:= (SELECT count(*) FROM event_balance WHERE event_type = 'other_contract' and monthname(event_balance.date) = monthname(CURDATE()));
IF (#check_if_cont_doc = 0) Then
call proc_leave_bal_doc_cont();
Insert into event_balance (event_type,`date`) values('doctor_contract',CURDATE())
END IF;
IF (#check_if_cont_other = 0) Then
call proc_leave_bal_other_cont();
Insert into event_balance (event_type,`date`) values('other_contract',CURDATE())
END IF;
END //
You want to make sure that the event_scheduler is set to ON in your my.cnf file. Head over to your my.cnf file (or my.ini file if you are using Windows) and either comment out the event_scheduler=DISABLED or set event_scheduler=ON. Then restart. This is make sure that your events run after a server reboot. There is some more info about it here:dev.mysql.com/doc/refman/5.5/en/events-configuration.html

MySQL event is not running after an interval

I have created an event in MySQL using this query:
delimiter $$
create event update_usability_score
on schedule every 1 day
starts '2013-01-07 18:22:00'
do
begin
insert into table_name(pk_id,name) values(1,"testing");
update table table_name set name = 'Not testing' where name like '%testing%';
end//
delimiter ;
When I run this for 1st time it's working fine and not showing any error. As I queried this event will run every day. But it is not running everyday.
When I check with this:
select name, last_executed from mysql.event;
it is showing the start date. Means it is not running everyday.
How to run this event everyday? Anything I have missed in the query?
Please help to solve this problem, thanks in advance.
You need to set ON COMPLETION PRESERVE option:
CREATE EVENT update_usability_score
ON SCHEDULE EVERY 1 DAY
STARTS '2013-01-07 18:22:00'
ON COMPLETION PRESERVE
DO
BEGIN
...
END
From the event documentation:
Normally, once an event has expired, it is immediately dropped. You can override this behavior by specifying ON COMPLETION PRESERVE. Using ON COMPLETION NOT PRESERVE merely makes the default nonpersistent behavior explicit.
This particular event would fail because the very first query in the event would fail if you would run it second time as id 1 would be already in the database.

How to schedule a stored procedure in MySQL

I have this stored procedure. How can I run this for example with intervals of 5 seconds? Like a routine for eliminate data with a time-stamp older than one day?
DROP PROCEDURE IF EXISTS `delete_rows_links`
GO
CREATE PROCEDURE delete_rows_links
BEGIN
DELETE activation_link
FROM activation_link_password_reset
WHERE TIMESTAMPDIFF(DAY, `time`, NOW()) < 1 ;
END
GO
You can use mysql scheduler to run it each 5 seconds. You can find samples at http://dev.mysql.com/doc/refman/5.1/en/create-event.html
Never used it but I hope this would work:
CREATE EVENT myevent
ON SCHEDULE EVERY 5 SECOND
DO
CALL delete_rows_links();
I used this query and it worked for me:
CREATE EVENT `exec`
ON SCHEDULE EVERY 5 SECOND
STARTS '2013-02-10 00:00:00'
ENDS '2015-02-28 00:00:00'
ON COMPLETION NOT PRESERVE ENABLE
DO
call delete_rows_links();
In order to create a cronjob, follow these steps:
run this command : SET GLOBAL event_scheduler = ON;
If ERROR 1229 (HY000): Variable 'event_scheduler' is a GLOBAL
variable and should be set with SET GLOBAL:
mportant
It is possible to set the Event Scheduler to DISABLED only at server startup. If event_scheduler is ON or OFF, you cannot set it to DISABLED at runtime. Also, if the Event Scheduler is set to DISABLED at startup, you cannot change the value of event_scheduler at runtime.
To disable the event scheduler, use one of the following two methods:
As a command-line option when starting the server:
--event-scheduler=DISABLED
In the server configuration file (my.cnf, or my.ini on Windows systems):
include the line where it will be read by the server (for example, in a [mysqld] section):
event_scheduler=DISABLED
Read MySQL documentation for more information.
DROP EVENT IF EXISTS EVENT_NAME;
CREATE EVENT EVENT_NAME
ON SCHEDULE EVERY 10 SECOND/minute/hour
DO
CALL PROCEDURE_NAME();
If you're open to out-of-the-DB solution: You could set up a cron job that runs a script that will itself call the procedure.