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
索引用于防止一个标记中有两个相同的子标记
因为当我更改/添加/删除子标记时,父标记在逻辑上也会更新,我想在所有父标记中级联新的时间戳(fieldmodified
)更新,所以我创建了一个触发器:
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运算符将是关键:)