gpt4 book ai didi

MySQL 老化触发器

转载 作者:行者123 更新时间:2023-11-29 08:23:05 24 4
gpt4 key购买 nike

我正在尝试创建一个触发器,当月份列为 12 时,该触发器会自动将年份列加 1,然后清空月份列。但我不太了解触发器,而且我在尝试中感到困惑,所以我希望有人可以查看这段代码,看看它是否有效或提出改进建议:

CREATE TRIGGER aging BEFORE UPDATE ON dogs
FOR EACH ROW
DELETE FROM dogs WHERE month = 12;
UPDATE year SET year = year+1;

谢谢!

最佳答案

有两点需要指出...

首先,对于您想要做的事情来说,触发器显然是错误的选择。不仅因为可以通过根据出生日期动态计算年龄来避免触发。而且,因为触发器仅影响受相应语句影响的行。不要被FOR EACH ROW所迷惑。你写类似的东西

UPDATE table SET whatever = whatever WHERE month = 12;

并且 Month = 12 为 true 的所有行都会受到影响。您似乎想要做的是更新整个表以检查某些行中您的条件是否为真。这不仅是性能噩梦,而且每个表只能使用一个触发器(每个事件)。这意味着您可以拥有 1 个 BEFORE UPDATE 和 1 个 AFTER UPDATE,但不能拥有 2 个 BEFORE UPDATE

要注意的第二件事是,您不能在 UPDATE 触发器中发出 UPDATE 语句。这会导致无限循环:)

您可以使用别名 NEWOLDNEW 指的是 UPDATE 语句给出的列的值,OLD 指的是执行 UPDATE 语句之前的列的值。

在您的情况下(尽管现在希望很清楚,在这种情况下您不应该使用触发器),人们会像这样编写触发器:

鉴于此初步声明

UPDATE myTable SET whatever = whatever;

更新整个表,此触发器

DROP TRIGGER IF EXISTS [whatever you call this thing];

DELIMITER @@
CREATE TRIGGER aging BEFORE UPDATE ON dogs
FOR EACH ROW
IF (month = 12) THEN /*month refers to the column here, not a variable like in Gordon's answer*/
SET NEW.year = OLD.year+1;
SET NEW.month = 1;
END IF;
END @@

将正确更新列。

关于MySQL 老化触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18771080/

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