gpt4 book ai didi

MySQL 触发器不起作用?

转载 作者:行者123 更新时间:2023-11-30 01:34:26 25 4
gpt4 key购买 nike

所以我即将进行这个测试,并且正在进行练习测试,但不知怎的,我的触发器不起作用。我完全按照别人教我的去做,但就是行不通。有人可以帮助我吗?

我创建了这个表:

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

最佳答案

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

Can't update table 'discountactions' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

现在,如果startdate <当前日期,您可以防止插入行:

  1. 将触发器从 AFTER 更改为 BEFORE 触发器
  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演示。取消注释最后一个插入语句,可以看到触发器不允许插入。

关于MySQL 触发器不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17088267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com