MySQL触发器不起作用?

时间:2013-06-13 13:26:37

标签: mysql triggers

所以我已经接受了这个测试,我正在进行练习测试,但不知怎的,我的触发器无法正常工作。我完全按照自己的教导完成了,但它不起作用。有人能帮助我吗?

我创建了这个表:

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是过去的,它应该删除整个折扣操作,因为它是不可能的。

1 个答案:

答案 0 :(得分:0)

你的触发器没有语法错误。这是 SQLFiddle ,表明了这一点。但遗憾的是,你的触发器无效。在满足条件时,您最终会遇到错误

  

无法在存储的函数/触发器中更新表'discountactions'   因为它已被调用此存储的语句使用   功能/触发。

现在要防止在startdate&lt;您可以在当前日期:

  1. 将触发器从AFTER更改为BEFORE触发器
  2. 如果满足条件,则仅违反现有约束之一。由于您表格中的startdateNOT NULL约束,我们可以利用它。
  3. 以下是触发器的工作版本可能是什么样的

    CREATE TRIGGER checkStartDatum
    BEFORE INSERT ON DiscountActions
    FOR EACH ROW 
      SET NEW.startdate = IF(NEW.startdate < CURDATE(), NULL, NEW.startdate);
    

    这是一个单语句触发器,因此您甚至不需要更改分隔符。

    这是 SQLFiddle 演示。取消注释最后一个insert语句,并看到触发器不允许插入。