自动更新MySql字段

时间:2012-01-02 21:59:30

标签: mysql sql

我有2个mysql表,我想要:

1)当我删除文章时,相关标签将被自动删除

2)当我添加/删除标签时,文章中的“hasTags”字段将自动更新(0 - 0标签,1 - 1 +标签)。

For 1 - 我使用了外键并且它可以正常工作

ALTER TABLE `articles`
  ADD CONSTRAINT `articles_ibfk_1` FOREIGN KEY (`id`) REFERENCES `tags` (`id`) ON DELETE CASCADE;

我不知道第二部分该怎么做。有可能吗?

表格是

articles == id | title | content | hasTags

tags == id | articleId | tagname

谢谢!

2 个答案:

答案 0 :(得分:4)

对于第2部分,您可以在应用程序代码中添加/删除标记的部分执行此操作。

更新,我建议将hastags作为参考计数器,这样就可以避免@James提到的问题。

或者您可以创建3个触发器:

DELIMITER $$

CREATE TRIGGER ai_tags_each AFTER INSERT ON tags FOR EACH ROW
BEGIN
  UPDATE articles SET hasTags = COALESCE(hastags,0) + 1 WHERE id = NEW.article_id;
END $$

CREATE TRIGGER ad_tags_each AFTER DELETE ON tags FOR EACH ROW
BEGIN
  UPDATE articles SET hasTags = hasTags - 1 WHERE id = OLD.article_id;
END $$

CREATE TRIGGER au_tags_each AFTER UPDATE ON tags FOR EACH ROW
BEGIN
  UPDATE articles SET hasTags = hasTags - 1 WHERE id = OLD.article_id;
  UPDATE articles SET hasTags = COALESCE(hastags,0) + 1 WHERE id = NEW.article_id;
END $$

DELIMITER ;

答案 1 :(得分:1)

对于第1部分,您已经以相反的方式定义了FOREIGN KEY。你需要:

ALTER TABLE tags
  ADD CONSTRAINT articles_tags_FK
        FOREIGN KEY (articleId) 
          REFERENCES articles (id) 
        ON DELETE CASCADE;

对于第2部分,您真的需要hasTags列吗?

您可以放弃并使用:

SELECT a.id
     , a.title
     , a.content
     , EXISTS (SELECT * FROM tags WHERE articleId = a.id)
       AS hasTags
FROM articles AS a