SQL过期日期触发器



我正在尝试为一个表创建一个触发器,该表包含分配给某些ID的某些键。

我想做的是:

CREATE TRIGGER expirationDateCheck
BEFORE UPDATE ON sp
FOR EACH ROW
BEGIN
IF DATE_ADD(OLD.date,INTERVAL 10 DAY) > CURDATE() THEN
SET OLD.sid=0,OLD.cid=0
END IF
END

基本上,每次要将某些内容放入sp表时,我都要首先遍历表,找到当前日期比分配给该行的日期晚10天的任何行,并将它们的sid和cid设置为0。

我该怎么做?

在触发操作中,FOR EACH ROW是指"受触发操作影响的每一行",而不是"表中存在的每一行"。因此,如果您在语法上修复了这个问题,它将只对更新的行进行操作。

在语法上,您可能正在查找操作中的UPDATE语句:

 UPDATE sp SET sid = 0, cid = 0 WHERE DATE_ADD(date, INTERVAL 10 DAY) > CURDATE()

给出或去掉OLD或NEW限定符。在某些版本的SQL(如标准SQL)中,您需要一个REFERENCING语句:

ON sp REFERENCING OLD AS OLD, NEW AS NEW

好吧,这是我在Informix中使用的符号,它允许;您可能需要指定除OLD和NEW之外的别名,或者您的DBMS可能隐式地使用带有OLD和NEW的引用表示法。因为你没有提到DBMS,所以很难确定。

您不希望在触发器中这样做。你可能认为你想这么做,但这不是触发的作用。不要虐待它们有很多理由,其中最重要的一点是,如果你虐待它们,它们会咬你。

你可能根本不想更新行!与其说让我更新超过10天的行,不如创建一个视图,对超过10天的行返回这些列为零(或消除这些行,等等)。这为您节省了定期维护和不必要的I/O,保留了实际的、真实的数据,并解决了10天检查最后一次更新表的时间问题。

最新更新