0

我正在尝试为包含分配给某些 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 .

我怎样才能做到这一点?

4

2 回答 2

0

您不想在触发器中执行此操作。你可能认为你想要,但这不是触发器的用途。有很多理由不滥用它们,尤其是如果你这样做它们会咬你。

您可能甚至不想更新行!与其说,让我更新超过 10 天的行,不如创建一个视图,为超过 10 天的行将这些列返回为零(或消除此类行等)。这为您节省了定期维护和不必要的 I/O,保留了实际的真实数据,并讨论了表上次更新时间以进行 10 天检查的问题。

于 2013-05-13T05:39:12.897 回答
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,因此很难确定这一点。

于 2013-05-12T03:30:41.990 回答