【发布时间】:2012-11-30 18:24:52
【问题描述】:
我正在尝试创建(基于 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',我需要:
- 删除“消息”表中的一行
- 删除“message_tag_link”表中的关联行
- 如果消息删除成功,则减少“tags”表中的计数值,或者如果计数变为零,则完全删除该行。
是否可以在 MySQL 中使用 Java PreparedStatement 完成所有这些操作?任何指针都非常感谢。我是一个完全的 MySQL 新手,所以请善待!
【问题讨论】:
-
存储计数是否有原因?您可以只使用附加的消息数。
-
...也许使用
VIEW来计算标签计数。 -
@Jim 是的。我可以看到没有计数列的解决方案可能有效。我不清楚的是如果没有此列,当您从“消息”和链接表中删除行时,您可能会在标签列中留下不再对应于消息的行(即计数为零的情况)一个标签)。这就是为什么我认为 count 列将是解决这个问题的一种很好且快速的方法 - 但不知道如何使用它,因此我的问题!
标签: java mysql prepared-statement sql-delete