2013-07-01 2 views
0

Я просто пытаюсь использовать триггер вместо ограничения проверки и кода, но он дает мне ошибку.Синтаксическая ошибка в mysql 'trigger'

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;$$ 

И ошибка

#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;$$ 

и ошибка

#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 

Той помощи

+0

Где ваш * trigger_time * и * trigger_event *? 'CREATE TRIGGER конфликт ПЕРЕД UPDATE НА roozane' http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html – DevlshOne

+0

да фиксированной TNX, но теперь он направляется ВСТАВИТЬ команду и здесь показать синтаксическую ошибку – user2540401

+0

Прошу прощения, но я не понимаю ваш последний комментарий. Не могли бы вы опубликовать обновленный запрос и ошибку? – DevlshOne

ответ

1

Вам нужно * trigger_time * и * trigger_event *. Например:

0

Для каждого завершающего действия составных операторов требуется точка с запятой после каждого end if.

Вам не нужна точка с запятой после последнего END, так как предположительно вы использовали DELIMITER $$ для изменения терминатора операторов в mysql-клиенте.

Я проверил следующее. Он не получил синтаксическую ошибку, но, конечно, у меня нет таблицы с именем roozane, поэтому я получил другую ошибку. :-)

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$$ 
0

У вас есть несколько проблем с вашим триггером.

Что касается синтаксических и логических ошибок идут

  1. Глядя на сообщение об ошибке, очевидно, вы не использовали DELIMITER $$ на самого начало вашего скрипта.
  2. У вас есть три необъявленных переменных в вашем триггере. rDate, rStartTime, rEndTime. Если вы используете переменные уровня хранимой процедуры, вам нужно сначала объявить их и в конечном итоге присвоить им значения.
  3. Как @BillKarwin отметил в своем ответе вы должны иметь точку с запятой в конце каждого IF ... END IF; заявления и вам не нужна точка с запятой после закрытия END из BEGIN...END блока вашего триггера, так как вы должны изменили DELIMITER раньше $$.

Это сказанное синтаксически правильная версия вашего триггера может быть следующая

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$$ 

Вот SQLFiddle демо, что показывает, что теперь ваш триггер успешно создан , но ничего не делает так объявленных переменных default имеют значения NULL, а другим значениям не присвоены.

Здесь идет самая важная часть: событие, если проблема с переменными будет исправлена, к сожалению, триггер не будет работать в любом случае, потому что MySql с весьма ограниченной поддержкой триггеров не позволяет операторы манипулирования данными (INSERT в вашем случае) в том же столе (roozane в вашем случае), к которому вы прикрепляете ваш спусковой крючок.

Теперь, чтобы помочь вам устранить триггер, вам нужно объяснить, что вы хотите, чтобы ваш триггер проверял.

Смежные вопросы