我正在为一个 php 站点编写一个简单的论坛。我正在尝试计算每个类别的帖子数。现在一个类别可以属于另一个类别,根类别被定义为具有 NULL parent_category_id。使用这种架构,一个类别可以有无限数量的子类别,并使表结构保持相当简单。
为了简单起见,假设类别表有 3 个字段:category_id
、parent_category_id
、post_count
。我不认为剩余的数据库结构是相关的,所以我暂时不考虑它。
另一个触发器正在调用使该触发器运行的类别表。我想要的是更新帖子数,然后递归地遍历每个父类别,增加帖子数。
DELIMITER $$
CREATE TRIGGER trg_update_category_category_post_count BEFORE UPDATE ON categories FOR EACH ROW
BEGIN
IF OLD.post_count != NEW.post_count THEN
IF OLD.post_count < NEW.post_count THEN
UPDATE categories SET post_count = post_count + 1 WHERE categories.category_id = NEW.parent_category_id;
ELSEIF OLD.post_count > NEW.post_count THEN
UPDATE categories SET post_count = post_count - 1 WHERE categories.category_id = NEW.parent_category_id;
END IF;
END IF;
END $$
DELIMITER ;
我得到的错误是:
#1442 - Can't update table 'categories' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
我认为您可以在每个页面加载时执行 count() 来计算帖子总数,但在大型论坛上,这会减慢速度,正如此处多次讨论的那样(例如,使用 php 计数帖子或存储在数据库中)。因此,为了将来打样,我将帖子计数存储在表中。为了更进一步,我想我会使用触发器来更新这些计数而不是 PHP。
我知道 MySQL 对在正在更新的同一个表上运行触发器存在限制,这就是导致此错误的原因(即停止无限循环),但在这种情况下,一旦到达具有 NULL parent_category_id 的类别,循环肯定会停止? 无论是调整这个触发器还是完全不同的东西,都必须有某种解决方案。谢谢。
编辑我很欣赏这可能不是最好的做事方式,但它是我能想到的最好的事情。我想如果您将父母类别更改为另一个类别,它会搞砸,但这可以通过另一个重新同步所有内容的触发器来解决。我对如何解决这个问题的其他建议持开放态度。