1

我正在尝试创建(基于 java 的)消息传递 webapp。消息使用 MySQL 使用三个表存储:

  • 'messages':有两列,一个 id 主键('idmessage')和消息('message')。
  • 'tags':用户还输入与他们的消息相关联的标签。这有两列 - 标签(也是主键)和计数('count')。
  • 'message_tag_link':由于消息和标签之间存在多对一的关系,因此我有第三个链接表。这有两列,消息的外键('fk_idmessage')和标签表的 ID('fk_tag')。

将消息插入数据库工作正常。我在 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 (? , ?)");

可以看出,每次创建重复的标签条目时,pst2 中的“计数”都会增加。我正在尝试弄清楚如何完全删除一条消息。我on delete cascade在链接表的列中对我的外键进行了描述,但不确定下一步该做什么。对于给定的“messageid”,我需要:

  1. 删除“消息”表中的一行
  2. 删除“message_tag_link”表中的关联行
  3. 当消息删除成功时减少'tags'表中的计数值,或者如果计数变为零则完全删除该行。

是否可以使用 Java 在 MySQL 中完成所有这些操作PreparedStatement?任何指针都非常感谢。我是一个完全的 MySQL 新手,所以请善待!

4

1 回答 1

0

这些查询应该满足您的需求。? 在每个查询中应该是要删除的消息 ID

//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;

正如您所发现的那样,保持计数可能很烦人。更好的是使用链接本身。

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

您还可以添加一个 CASCADE,以便在删除消息时标签链接也会被删除(请参见此处)。但是要小心这种行为)。

此解决方案仍然会留下没有消息的标签,但您可以使用以下查询删除这些标签:

DELETE FROM tags t WHERE NOT EXISTS (SELECT 1 FROM nessage_tag_link WHERE t.tag_id = fk_tag)
于 2012-12-13T03:39:01.767 回答