我正在尝试为包含分配给某些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表时,我首先要查看表,找到当前日期晚于分配给该行的日期十天的行,并设置它们的sid和cid是0。
我该怎么做?
答案 0 :(得分: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,因此很难确定这一点。
答案 1 :(得分:0)
您不希望在触发器中执行此操作。你可能认为你想要,但这不是触发器的用途。有很多理由不滥用它们,尤其是如果你这样做,它们会咬你。
您可能甚至不想更新行!而不是说,让我更新10天以上的行,创建一个视图,将超过10天的行返回零(或消除此类行等)。这样可以节省定期维护和不必要的I / O,保留实际的真实数据,并且可以确定上次更新10天检查表的时间。