0

所以我有这个测试即将到来,我正在做练习测试,但不知何故我的触发器不起作用。我已经完全按照我被教导的那样做了,但它就是行不通。有谁能够帮我?

我创建了这张表:

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 是否是过去的。如果开始日期是过去的,它应该删除整个折扣操作,因为这是不可能的。

4

1 回答 1

0

您的触发器在语法上没有任何问题。这是表明这一点的SQLFiddle 。但不幸的是,您的触发器不起作用。当条件满足时,您最终会遇到错误

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

现在为了防止插入一行 if startdate< 当前日期,您可以:

  1. 将触发器从触发器更改AFTERBEFORE触发器
  2. 如果满足条件只是违反现有约束之一。由于startdate在您的表中有一个NOT NULL约束,我们可以利用它。

这是您的触发器的工作版本可能的样子

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

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

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

于 2013-06-13T23:49:22.607 回答