2012-12-12 3 views
1

J'essaie de créer une application web de messagerie (Java). Les messages sont stockés en utilisant MySQL à l'aide de trois tables:Suppression de lignes dans des tables MySQL liées et décrémentation du nombre dans une autre table

  • 'messages': a deux colonnes, une clé primaire identifiant ('de idmessage') et le message ('message').
  • 'Tags': L'utilisateur saisit également une étiquette associée à son message. Cela a deux colonnes - l'étiquette (qui est aussi une clé primaire) et un compte («count»).
  • 'message_tag_link': Comme il existe une relation plusieurs-à-un entre les messages et les balises, j'ai une troisième table de liaison. Cela a deux colonnes, à la fois les clés étrangères aux messages ('fk_idmessage') et les balises tables 'ids (' fk_tag ').

L'insertion de messages dans la base de données fonctionne correctement. J'utilise ces lignes suivantes en Java:

pst1 = connection.prepareStatement("INSERT INTO messages(message) VALUES (?)"); 
pst2 = connection.prepareStatement("INSERT INTO tags(tag,count) VALUES (?,1) ON  DUPLICATE KEY UPDATE count = count + 1"); 
pst3 = connection.prepareStatement("INSERT INTO message_tag_link(fk_idmessage,fk_tag) VALUES (? , ?)"); 

Comme on le voit par incréments de « count » en PST2 chaque fois est fait une entrée d'étiquette en double. J'essaie de savoir comment supprimer complètement un message. J'ai la description on delete cascade sur mes clefs étrangères dans les colonnes de ma table de lien mais je ne suis pas sûr que faire ensuite. Pour une donnée « messageid » je dois:

  1. Supprimer une ligne dans la table 'messages de
  2. Supprimer la ligne associée à la table « message_tag_link »
  3. Décrémenter la valeur de comptage dans les « tags 'table quand une suppression de message est réussie, ou supprimez cette ligne entièrement si count devient zéro.

Est-il possible de faire tout cela dans MySQL en utilisant un Java PreparedStatement? Des pointeurs très appréciés. Je suis un novice MySQL total, alors s'il vous plaît soyez gentil!

+2

Y at-il une raison pour laquelle le compte est stocké? Vous pouvez simplement utiliser le nombre de messages joints. – Jim

+0

... et peut-être utiliser un 'VIEW' pour calculer le nombre de balises. – feeela

+0

@Jim Oui. Je peux voir une solution sans la colonne de compte pourrait fonctionner. Ce que je ne comprends pas est sans cette colonne, quand vous supprimez des lignes de 'messages' et la table de liens vous êtes potentiellement laissé avec une ligne dans la colonne des étiquettes qui ne correspond plus à un message (c.-à-d. Une étiquette).C'est pourquoi j'ai pensé que la colonne de compte serait une manière bonne et rapide d'adresser ceci - mais aucune idée comment l'employer, d'où ma question! – Jon

Répondre

0

Ces requêtes devraient faire ce dont vous avez besoin. ? dans chaque requête doit être l'identifiant de message qui doit être supprimé

//Update count 
UPDATE tags SET `count` = `count` - 1 WHERE tag_id IN (SELECT fk_tag FROM message_tag_link WHERE fk_idMessage = ?); 
//Remove link 
DELETE FROM message_tag_link WHERE fk_idmessage = ?; 
DELETE FROM messages WHERE id = ?; 
//Remove unused tags 
DELETE FROM tags WHERE `count` = 0; 

Comme vous l'avez découvert cependant maintenir un nombre peut être ennuyeux. Mieux vaut utiliser le lien lui-même.

SELECT COUNT(fk_idmessage) AS msgcount FROM message_tag_link WHERE fk_tag = ?; 

vous pouvez également ajouter un CASCADE de sorte que lorsque les messages sont supprimés le lien tag est supprimé aussi (voir here). Soyez prudent avec ce comportement cependant).

Cette solution laisse encore des tags sans message, mais vous pouvez les supprimer en utilisant la requête:

DELETE FROM tags t WHERE NOT EXISTS (SELECT 1 FROM nessage_tag_link WHERE t.tag_id = fk_tag) 
+0

"COUNT" est un mot-clé MySQL. Je suggère d'utiliser des ticks de retour: UPDATE \ 'tags' SET \' count' = \ 'count' - 1 ... etc – Anton

+0

@Anton bien repéré. Avoir échappé au champ de compte le cas échéant. – Jim

+0

Sucré. Je suis allé pour le plus haut verbeux (et gardé ma colonne de compte) et cela a fonctionné un régal. – Jon

Questions connexes