mysql'trigger'中的语法错误

时间:2013-07-01 20:37:45

标签: mysql triggers

我只是尝试使用触发器而不是检查约束和代码一,但它给了我一个错误。

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

修改

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

tnx寻求帮助

3 个答案:

答案 0 :(得分:1)

您需要* trigger_time *和* trigger_event *。例如: CREATE TRIGGER conflict AFTER INSERT

答案 1 :(得分: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$$ 

答案 2 :(得分:0)

您的触发器有几个问题。

就语法和逻辑错误而言

  1. 查看错误消息显然您在脚本开始时没有使用DELIMITER $$
  2. 您的触发器rDaterStartTimerEndTime中有三个未声明的变量。如果使用存储过程级别变量,则需要先声明它们,然后最终为它们赋值。
  3. 正如@BillKarwin在他的回答中提到的,你必须在每个IF ... END IF;语句的末尾加上分号,并且在关闭END块的BEGIN...END之后你不需要分号触发,因为您之前应该DELIMITER更改为$$
  4. 那说你的触发器的语法正确版本可能会跟随

    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 演示,显示现在您的触发器已成功创建但不执行任何操作,因为默认情况下声明的变量的值为{{1} }和其他值尚未分配给它们。

    这里有最重要的部分:事件如果变量问题将被解决,那么无论如何你的触发器将无法正常工作因为MySql的支持相当有限触发器不允许在您将触发器附加到同一个表(NULL)上的数据操作语句(在您的情况下为INSERT)。

    现在,为了帮助您修复触发器,您需要解释您希望触发器检查的内容。