所以我已经接受了这个测试,我正在进行练习测试,但不知怎的,我的触发器无法正常工作。我完全按照自己的教导完成了,但它不起作用。有人能帮助我吗?
我创建了这个表:
CREATE TABLE DiscountActions(
discountID int(5) NOT NULL AUTO_INCREMENT,
dishName varchar(70) NOT NULL,
type varchar(70) NOT NULL,
discountPercentage varchar(70) NOT NULL,
startdate date NOT NULL,
enddate date NOT NULL,
PRIMARY KEY (discountID)
);
我想添加此触发器:
DELIMITER //
CREATE TRIGGER `checkStartDatum`
AFTER INSERT ON `DiscountActions`
FOR EACH ROW
BEGIN
IF NEW.startdate < DATE(NOW())
THEN DELETE
FROM DiscountActions
WHERE startdate = NEW.startdate;
END IF ;
END ;
//
但是当我添加它时,出现以下错误:我收到以下错误:#1064 - 您的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在第6行“THEN DELETE FROM kortingactie WHERE begindatum = NEW.b”附近使用正确的语法
它应该做的是:当你添加一个新的DiscountAction时,它应该检查startdate是否在过去。如果startdate是过去的,它应该删除整个折扣操作,因为它是不可能的。
答案 0 :(得分:0)
你的触发器没有语法错误。这是 SQLFiddle ,表明了这一点。但遗憾的是,你的触发器无效。在满足条件时,您最终会遇到错误
无法在存储的函数/触发器中更新表'discountactions' 因为它已被调用此存储的语句使用 功能/触发。
现在要防止在startdate
&lt;您可以在当前日期:
AFTER
更改为BEFORE
触发器startdate
有NOT NULL
约束,我们可以利用它。以下是触发器的工作版本可能是什么样的
CREATE TRIGGER checkStartDatum
BEFORE INSERT ON DiscountActions
FOR EACH ROW
SET NEW.startdate = IF(NEW.startdate < CURDATE(), NULL, NEW.startdate);
这是一个单语句触发器,因此您甚至不需要更改分隔符。
这是 SQLFiddle 演示。取消注释最后一个insert语句,并看到触发器不允许插入。