2012-01-02 7 views
0

J'ai 2 tables de MySQL et je veux que:mise à jour automatique du champ MySql

1) lorsque je supprime un article, les balises associées seront automatiquement supprimés

2) quand j'ajouter/supprimer une balise, le champ "hasTags" des articles à mettre à jour automatiquement (0 - pour les tags 0, 1 - pour les tags 1+).

Pour 1 - J'ai utilisé une clé étrangère et il fonctionne

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

Je ne sais pas comment faire pour la deuxième partie. C'est possible?

Les tables sont

articles == id | title | content | hasTags 

tags == id | articleId | tagname 

Merci!

+1

On dirait que vous avez besoin d'écrire une procédure stockée (mieux) ou un déclencheur. – Ben

+0

Structure de table impaire. Donc, chaque étiquette ne peut avoir qu'un seul article? Pourquoi ne pas avoir une table de jointure de sorte que chaque balise puisse être appliquée à de nombreux articles et que chaque article puisse contenir plusieurs balises? – James

Répondre

4

Pour la partie 2, vous pouvez le faire sur votre code d'application, dans la partie où vous ajoutez/supprimez également une étiquette. Mise à jour, je suggère de faire hastags un compteur de référence, de cette façon vous évitez le problème @James mentionné.

Ou vous pouvez créer trois déclencheurs:

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

si un article a 2 balises alors votre 2ème déclencheur mettra à tort hasTags à 0 si l'un d'eux est supprimé. – James

+0

@James, stupide moi, réécrit dans un compteur de référence – Johan

1

Pour la partie 1, vous avez défini le FOREIGN KEY dans le sens opposé. Vous avez besoin:

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

Pour la partie 2, avez-vous vraiment besoin de la colonne hasTags?

Vous pouvez déposer et utiliser:

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