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

Mysql 如何使用触发器递归更新字段?,mysql,recursion,triggers,sql-update,Mysql,Recursion,Triggers,Sql Update,表格结构为: 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 U

表格结构为:

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结构。每个
标记
都可以有它的父级(或顶层的
NULL
),我希望存储上次修改标记的时间,以便缓存。
UNIQUE
索引用于防止一个标记中有两个相同的子标记

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

CREATE TRIGGER `tags_AINS` AFTER INSERT ON `tags` FOR EACH ROW
  UPDATE `tags` SET `modified` = CURRENT_TIMESTAMP() WHERE `idtag` = NEW.parent;
(更新后的
和删除后的
触发器的代码相同)

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

然而,这在MySQL中是不可能的(例如,请参阅)。我也尝试过在插入之前使用
触发器,但错误是相同的

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

有可能实现我想要的吗


(数据库将与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))
如果这仍然不起作用,也许可以考虑使用存储过程

而不是调用“插入标签…” 您可以创建一个存储过程并像“callupdate_tags(…)”那样调用它


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

在确定正确的递归查询后,查看此问题,了解有关如何执行递归查询的更多想法。我认为使用IN运算符将是关键:)