2012-01-02 72 views
0

我有2个MySQL表,我想的是:自动更新的MySQL场

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

2)当我添加/删除标签,要自动更新的文章中的“hasTags”字段(0代表0个标记,1代表1个标记)。

对于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 

谢谢!

+1

听起来像是你需要写一个存储过程(更好)或触发器。 – Ben 2012-01-02 22:01:44

+0

奇数表结构。那么每个标签只能有一篇文章?为什么不能有一个连接表,这样每个标签就可以应用到许多文章中,并且每篇文章都可以有多个标签? – James 2012-01-02 22:33:53

回答

4

对于第2部分,您可以在您的应用程序代码中添加/删除标签。

更新,我会建议使hastags一个引用计数器,这样你可以避免@詹姆斯提到的问题。

或者你可以创建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 ; 
+0

如果一篇文章有​​2个标签,那么你的第二个触发器将错误地将hasTags设置为0,如果其中一个被删除。 – James 2012-01-02 22:35:01

+0

@詹姆斯,傻了我,把它改写成参考柜台 – Johan 2012-01-02 22:39:36

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