我只是尝试使用触发器而不是检查约束和代码一,但它给了我一个错误。
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寻求帮助
答案 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)
您的触发器有几个问题。
就语法和逻辑错误而言
DELIMITER $$
。 rDate
,rStartTime
,rEndTime
中有三个未声明的变量。如果使用存储过程级别变量,则需要先声明它们,然后最终为它们赋值。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 演示,显示现在您的触发器已成功创建但不执行任何操作,因为默认情况下声明的变量的值为{{1} }和其他值尚未分配给它们。
这里有最重要的部分:事件如果变量问题将被解决,那么无论如何你的触发器将无法正常工作因为MySql的支持相当有限触发器不允许在您将触发器附加到同一个表(NULL
)上的数据操作语句(在您的情况下为INSERT
)。
现在,为了帮助您修复触发器,您需要解释您希望触发器检查的内容。