我有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
谢谢!
答案 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