MySQL & trigger before insert - mysql

I need to create a trigger in my database.
The trigger must be able to analyse event before insert. In case of the last event already existing in the database has the same status, the trigger has to cancel the insert and update the last event.
I tried to create one but I can't add it in my database because of mysql errors:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5
Here the trigger:
CREATE TRIGGER events_before_insert
BEFORE INSERT ON monitoringV2.events
FOR EACH ROW
BEGIN
DECLARE id_last_event;
DECLARE status_last_event;
SELECT id INTO id_last_event, status INTO status_last_event FROM events WHERE module_id=NEW.module_id ORDER BY serverDate DESC LIMIT 1;
IF NEW.status = status_last_event THEN
UPDATE events SET serverDate=NOW() WHERE id=id_last_event;
signal sqlstate '00000' set message_text = "Update instead of insert";
END IF;
END;
Here are information server:
PHP 5.4.6 VC9
Apache 2.4.2 VC9
MySQL 5.5.27
PhpMyAdmin 3.5.2.2
Thanks for your help
Regards,
Dorine M.

You will need to delimit your create statement:
delimiter //
CREATE...
...
END;
//
DELIMITER ;
and you will probably need to define a type for each variable declared, e.g.
DECLARE x INT;

You have to change DELIMITER before creating a trigger like this
DELIMITER $$
CREATE TRIGGER...
...
END;
$$
DELIMITER ;

You might not need to implement a trigger for this. The operation you are describing is formally known as UPSERT, i.e. update or insert.
This is how it's done in MySQL and you could also look at REPLACE.
Here is another question covering this.

Related

MySQL syntax Error on Create Trigger

Here is my trigger, I am getting the MySQL syntax error. I wanted to reduce the balance from sms_index table sms_count column value.
CREATE TRIGGER sms_log_update AFTER UPDATE ON sms_index
FOR EACH ROW
BEGIN
IF NEW.approved_status = '1' THEN
UPDATE sms_package SET balance = (balance - OLD.sms_count) WHERE group_id = OLD.ins_group_id;
END IF;
END;
Error Message:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5
Your code looks correct, except for the possible problem of the delimiter. Try the following:
DELIMITER //
CREATE TRIGGER sms_log_update AFTER UPDATE ON sms_index
FOR EACH ROW
BEGIN
IF NEW.approved_status = '1' THEN
UPDATE sms_package SET balance = (balance - OLD.sms_count)
WHERE group_id = OLD.ins_group_id;
END IF;
END;//
DELIMITER ;
From the documentation:
However, just as for stored routines, if you use the mysql program to define a trigger that executes multiple statements, it is necessary to redefine the mysql statement delimiter so that you can use the ; statement delimiter within the trigger definition.

#1064 - You have an error in your SQL syntax; , SAMP MYSQL Error

I get this error on my PHPMyAdmin
#1064 - You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near '' at line 3
[EDIT]
Sorry, I didn't put the full thing before, i've already had an BEGIN and an END, Look.
CREATE TRIGGER `accounts_insert` BEFORE INSERT ON `accounts`
FOR EACH ROW BEGIN
SET new.RegiDate = now();
SET new.UpdateDate = now();
END;
This is the line ^^
If your trigger is only one instruction, you don't need the begin keyword:
create trigger `accounts_insert` before insert on `accounts`
for each row
set new.RegiDate = now();
If your trigger has multiple instructions, then you need to:
Change the default delimiter
Enclose the trigger instructions in a begin...end block
Restore the default delimiter
Example:
delimiter $$
create trigger `accounts_insert_2` before insert on `accounts`
for each row
begin
set new.RegiDate = now();
set #newRows = coalesce(#newRows, 0) + 1; -- Just a dummy example
end; &&
delimiter ;
Why the delimiter $$ and delimiter ; are important?
When you write a query, MySQL assumes that it ends where it finds the first standard "instruction terminator" (;). Since your trigger has more than one instruction, and every instruction must end with ;, then MySQL assumes that the trigger definition is ended, and (of course) fails to execute it. So, what can be done? Simply redefine temporally the standard instruction terminator:
delimiter $$
Now, each instruction must end with $$ to be executed. Define your trigger, and, when you want to end the definition, use your new temporary instruction terminator $$, and then redefine the terminator to the normal ;:
delimiter ;
This must be done every time you define a multi insstruction trigger or a stored procedure or function.

syntax error in mysql 'trigger'

I am just trying to use trigger instead of check constraint and code one but it gives me an error.
CREATE TRIGGER conflict
ON roozane
FOR EACH ROW
BEGIN
if rDate = NEW.rDate then
if NEW.rStartTime < rStartTime AND NEW.rEndTime < rEndTime then
INSERT INTO roozane (rID,rDate,rStartTime,rEndTime,rPlace,rComment,rType) values (NEW.rID,NEW.rDate,NEW.rStartTime,NEW.rEndTime,NEW.rPlace,NEW.rComment,NEW.rType);
end if
end if
END;$$
And error
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON roozane FOR EACH ROW BEGIN if ( rDate=NEW.rDate ) then if ( NEW.rStart' at line 2
EDIT
CREATE TRIGGER conflict BEFORE INSERT
ON roozane
FOR EACH ROW
BEGIN
if rDate = NEW.rDate then
if NEW.rStartTime < rStartTime AND NEW.rEndTime < rEndTime then
INSERT INTO roozane (rID,rDate,rStartTime,rEndTime,rPlace,rComment,rType) values (NEW.rID,NEW.rDate,NEW.rStartTime,NEW.rEndTime,NEW.rPlace,NEW.rComment,NEW.rType);
end if
end if
END;$$
and the error
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 7
tnx for help
You need a *trigger_time* and *trigger_event*. For example:
CREATE TRIGGER conflict AFTER INSERT
You need a semicolon after each end if to terminate those compound statements.
You don't need a semicolon after the last END, because presumably you have used DELIMITER $$ to change the statement terminator in the mysql client.
I tested the following. It did not get a syntax error, but of course I have no table called roozane so I got a different error. :-)
CREATE TRIGGER conflict BEFORE INSERT
ON roozane
FOR EACH ROW
BEGIN
if rDate = NEW.rDate then
if NEW.rStartTime < rStartTime AND NEW.rEndTime < rEndTime then
INSERT INTO roozane (rID,rDate,rStartTime,rEndTime,rPlace,rComment,rType) values (NEW.rID,NEW.rDate,NEW.rStartTime,NEW.rEndTime,NEW.rPlace,NEW.rComment,NEW.rType);
end if;
end if;
END$$
You have several problems with your trigger.
As far as syntactical and logic errors go
Looking at the error message apparently you didn't use DELIMITER $$ at the beggining of your script.
You have three undeclared variables in your trigger rDate, rStartTime, rEndTime. If you use stored procedure level variables you need to declare them first and eventually assign values to them.
As #BillKarwin mentioned in his answer you have to have semicolons at the end of each IF ... END IF; statement and you don't need semicolon after closing END of a BEGIN...END block of your trigger since you should've changed DELIMITER earlier to $$.
That being said syntactically correct version of your trigger might be following
DELIMITER $$
CREATE TRIGGER conflict
BEFORE INSERT ON roozane
FOR EACH ROW
BEGIN
DECLARE rDate DATE;
DECLARE rStartTime TIME;
DECLARE rEndTime TIME;
IF rDate = NEW.rDate THEN
IF NEW.rStartTime < rStartTime AND NEW.rEndTime < rEndTime THEN
INSERT INTO roozane (rID,rDate,rStartTime,rEndTime,rPlace,rComment,rType)
VALUES(NEW.rID,NEW.rDate,NEW.rStartTime,NEW.rEndTime,NEW.rPlace,NEW.rComment,NEW.rType);
END IF;
END IF;
END$$
Here is SQLFiddle demo that shows that now your trigger is being successfully created but does nothing since declared variables by default have values of NULL and other values have not been assigned to them.
Here goes the most important part: event if the problem with the variables will be fixed unfortunately your trigger won't work anyway because MySql with its rather limited support for triggers doesn't allow data manipulation statements (INSERT in your case) on the same table (roozane in your case) you are attaching your trigger to.
Now, to help you to fix your trigger you need to explain what you want your trigger to check for.

SQL Server To MySQL conversion script error surrounding UUID()?

ALTER TABLE aspnet_Paths ALTER PathId SET DEFAULT UUID();
I've ran a converter program on "generate" scripts from a SQL Server database.
I seem to be having uuid in the above statement highlighted in work benches query window with the statement "Error Syntax near uuid()",
I'm moving to MySQL. What's the correct implementation of this statement?
Any help/advise is much appreciated
Try to use a BEFORE INSERT trigger -
DELIMITER $$
CREATE TRIGGER trigger1
BEFORE INSERT
ON aspnet_paths
FOR EACH ROW
BEGIN
IF NEW.PathId IS NULL THEN
SET NEW.PathId = UUID();
END IF;
END
$$
DELIMITER ;

MySQL Trigger ERROR in phpAdmin

Hi
Is there any error in this TRIGGER Statement.When ever i try to run this in phpAdmin its giving error saying "#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near "SELECT Count(*) into SIM_CCode_Count".I cant get what's wrong in this..please help me
This is my trigger statement
CREATE TRIGGER Is_CountryCode_There After INSERT on mr_details FOR EACH ROW
BEGIN
DECLARE SIM_CCode_Count INTEGER;
DECLARE NET_CCode_Count INTEGER;
SELECT Count(*) into SIM_CCode_Count FROM Country_Main where CountryCode=NEW.SimCntISO;
IF SIM_CCode_Count=0 THEN
INSERT INTO Country_Main(CountryCode,CountryName) Values(NEW.SIMCntISO,"Unknown");
END IF
If NEW.SimCntISO<>NEW.NetCntISO then
SELECT Count(*) into NET_CCode_Count FROM Country_Main
where CountryCode=NEW.NetCntISO
IF NET_CCode_Count=0 THEN
INSERT INTO Country_Main(CountryCode,CountryName) Values(NEW.NETCntISO,"Unknown");
END IF
END IF
END
Without proper explanation about your requirement and about tables and what you are expecting this trigger to do,its very difficult to say if any issues there in your trigger..
But as far as i can see there is some minor correction need to be done..
Try this Code and let know in detail your requirements..
CREATE TRIGGER Is_CountryCode_There After INSERT on mr_details FOR EACH ROW
BEGIN
DECLARE SIM_CCode_Count INTEGER;
DECLARE NET_CCode_Count INTEGER;
SELECT Count(*) into SIM_CCode_Count FROM Country_Main where CountryCode=NEW.SimCntISO;
IF SIM_CCode_Count=0 THEN
INSERT INTO Country_Main(CountryCode,CountryName) Values(NEW.SIMCntISO,"Unknown");
END IF;
If (NEW.SimCntISO<>NEW.NetCntISO) then
SELECT Count(*) into NET_CCode_Count FROM Country_Main
where CountryCode=NEW.NetCntISO;
IF NET_CCode_Count=0 THEN
INSERT INTO Country_Main(CountryCode,CountryName) Values(NEW.NETCntISO,"Unknown");
END IF;
End IF;
END;
You have to declare a mysql-statement delimiter before the trigger statement:
DELIMITER |
CREATE TRIGGER ...
(your code)
END|
DELIMITER ;
Otherwise MySQL interprets your ; in this statement as statement commit and executes the code immidiately. With the delimiter changed to a different character you can use the semicolon inside the trigger declaration safely.
See here: http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html