gpt4 book ai didi

mysql - 如何使用触发器递归更新字段?

转载 作者:行者123 更新时间:2023-11-29 22:26:55 24 4
gpt4 key购买 nike

表结构为:

CREATE TABLE `tags` (
`idtag` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent` int(10) unsigned DEFAULT NULL,
`name` varchar(45) DEFAULT NULL,
`value` text COLLATE utf8_polish_ci,
`modified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`idtag`),
UNIQUE KEY `idx_parent_name` (`parent`,`name`),
KEY `idx_parent` (`parent`),
CONSTRAINT `fk_parent` FOREIGN KEY (`parent`) REFERENCES `tags` (`idtag`) ON DELETE CASCADE ON UPDATE CASCADE
)
ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8

这将类似于 XML 结构。每个 tag 都可以有其父级(或顶层的 NULL),并且我想存储上次修改标记的时间,以用于缓存目的。 UNIQUE 索引是为了防止一个标签内有两个相同的子标签。

因为当我更改/添加/删除子标签时,父标签逻辑上也会更新,我想在所有父标签中级联新的TIMESTAMP(字段modified)更新,所以我创建了一个触发器:

CREATE TRIGGER `tags_AINS` AFTER INSERT ON `tags` FOR EACH ROW
UPDATE `tags` SET `modified` = CURRENT_TIMESTAMP() WHERE `idtag` = NEW.parent;

(AFTER UPDATEAFTER DELETE 触发器的代码相同)

我希望能够以级联方式更新所有父标签。

但这在 MySQL 中是不可能的(例如,参见 this answer )。我也尝试过使用 BEFORE INSERT 触发器,但错误是相同的。

所以我的想法是,我将创建另一个表来存储时间戳,但我不知道如何递归地执行此操作(在另一个表上设置触发器会导致相同的问题)。

有可能实现我想要的吗?

(数据库将与 PHP 一起使用,我可以在那里执行此检查,但如果我需要从数据库读取所有子标签,则缓存将没有意义)

最佳答案

我实际上认为你可以使用触发器并用这样的东西更新它们像这样的东西:

CREATE TRIGGER `tags_AINS` AFTER INSERT ON `tags` FOR EACH ROW
UPDATE tags SET modified=NOW() WHERE idtag IN(
(SELECT @pv:=NEW.parent) WHERE idtag=@pv))

如果仍然不起作用,也许可以考虑使用存储过程?

而不是调用“INSERT INTO 标签...”您可以创建一个存储过程并像“CALL update_tags(...)”这样调用它

您的存储过程可以处理级联更新的逻辑。

关于mysql - 如何使用触发器递归更新字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30200838/

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