1

(Javaベースの)メッセージングWebアプリを作成しようとしています。メッセージは、次の3つのテーブルを使用してMySQLを使用して保存されます。

  • 'messages':id主キー('idmessage')とメッセージ('message')の2つの列があります。
  • 'tags':ユーザーはメッセージに関連付けられたタグも入力します。これには、タグ(主キーでもある)とカウント(「カウント」)の2つの列があります。
  • 'message_tag_link':メッセージとタグの間には多対1の関係があるため、3番目のリンクテーブルがあります。これには2つの列があり、メッセージへの外部キー('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で「count」が増加します。メッセージを完全に削除する方法を見つけようとしています。リンクテーブルの列に外部キーのon delete cascade説明がありますが、次に何をすべきかわかりません。与えられた'messageid'について、私は次のことをする必要があります:

  1. 'messages'テーブルの行を削除します
  2. 'message_tag_link'テーブルの関連する行を削除します
  3. メッセージの削除が成功した場合は「タグ」テーブルのカウント値をデクリメントするか、カウントがゼロになった場合はこの行を完全に削除します。

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 に答える