4

次のように、テーブル'release_group'と別のテーブル'release'があります。

release_group 
------------------------
release_group_id (PRIMARY KEY)
name
main_release_id (FOREIGN KEY)

release
------------------------
release_id (PRIMARY KEY)
release_group_id (FOREIGN KEY)
name

リリース行を作成すると、まだ作成されていないため、 release_group_idを使用できません。しかし、main_release_idなしでは release_group 行を作成できません。ですから、仕方のない状況です。

編集: release_group の main_release_id は、リリースがグループのメインであり、参照を使用するものであることを示しています。

このケースを処理する専門的な方法は何ですか?

1.テーブルrelease_groupの外部キー インデックス main_release_idを削除し、属性に ALLOW NULL を指定します。release_group 行を作成して、その ID をリリース行に適用できるようにします。

2. 「main_release_id」外部キー インデックスをテーブル「release_group」に保持し、それに一時的な整数値 0 を割り当てます。リリース行を作成し、それに応じて release_group の外部キーを更新しますか? これが進むべき道である場合、データベースでこの倫理がどうかわからない、値0の外部キーをうっかり持ってしまう可能性があることに注意してください。

このケースを処理する専門的な方法は何ですか?

ありがとう

4

3 に答える 3

5

リリースが複数のグループに属することができないことを確認すると、次の方法で複雑さを取り除くことができます。

  1. フィールドmain_release_idを完全に削除する

  2. テーブルにrelease_mainフィールドを追加します。release(メインでNULLはない)または1(メイン)になります。

  3. UNIQUE制約を追加して、(release_group_id, release_main)メイン リリースが 1 つだけになるようにします。

アップデート

リリースが複数のグループに属することができる場合は、多対多のテーブルを作成し、両方のテーブルの外部キーをそこに移動する必要があります。

(release_group_id [FK], release_id [FK], is_main)

主キーは、最初の 2 つのフィールドにまたがります。メイン リリースが 1 つだけになるようにするには、最初と最後のフィールドにまたがる一意のキーが必要です。

古い答え

がnull可能なフィールドであると仮定するmain_release_idと、私が提案するのは次のとおりです。

  1. を挿入しrelease_groupます; 最後に挿入された ID を取得します。main_release_idnull

  2. release前のステップの ID を渡してエントリを挿入します。最後に挿入された ID を取得します。

  3. release_groupテーブル エントリを更新しmain_release_id、 の値を前の手順で取得した値に設定します。

  4. トランザクションをコミットする

または、シーケンスを使用して、エントリを挿入する前に ID を知ることができます。この例については、マニュアルの を参照してくださいLAST_INSERT_ID()

于 2013-08-28T02:13:51.350 に答える
5

多対多の関係を作成しようとしているようです。これを正しく行うには、release_group テーブルと release テーブルの両方から外部キーを削除します。release_id 外部キーとリリース外部キーを含む新しいテーブル (release_to_release_group) を追加します。

編集:ここでは循環外部キーは必要ありません。release_group から main_release_id foreign_key を削除し、リリース テーブルに is_main_release フラグを追加します。

于 2013-08-28T02:17:31.063 に答える
2

このようにテーブルが相互に参照することは、通常は行われません。通常、親テーブル (release_group) を子テーブル (release) の外部キー参照として使用しますが、release_id を release_group テーブルの外部キーとして使用することはありません。

おそらく、リリース テーブルにブーリアン フラグを追加して、それがメイン リリースであることを示し、release_group の main_release_id を廃止します。

于 2013-08-28T02:14:35.197 に答える