2010-12-02 8 views
1

私は多くの子供を持つ親を持っていますが、これは問題ありません。各親に対して、私はdefault_childを格納しようとしています。私はdefault_childを必須にしたいと思いますが、これをどうやって行うのか考えることはできません。データベースの円/親の関係

最初に親を作成すると、default_childの必須条件に違反することになります。最初に子供を作ることは、それがFK状態に違反していることを意味します。

他の人はどう対処しますか?ありがとう!

答えて

2

制約は通常「遅延可能」とマークすることができます。つまり、コミット時までそれらのチェックを延期するようデータベースに依頼することができます。これにより、トランザクションを構築する際に制約を一時的に破る必要があるが、コミットする準備が整うまでにもう一度満足されるような状況を解決できます。

+0

ありがとうWyzard。ただMySQLのマニュアルをチェックして、遅延可能な参照を見ていませんでした。それがMySQLでサポートされているかどうか? –

+0

Kim、そうです、MySQLは制約を延期することをサポートしていないようです。 – Wyzard

0

親は子供がいる前に存在していなければなりません。人生で真実。データベースで真。

テーブルに挿入するすべてのアイテムがデフォルトで子を取得するようにするには、親レコードが挿入された直後に実行されるトリガーを使用します。

親レコードと子レコードが同じテーブルにある場合は、子を挿入するたびにトリガが再起動され、その子の子が作成されます。子の子の子の挿入をトリガする...

+0

"子供がいる前に親が存在する必要があります。"データベース用語では真実ではありません。原則として、外部キー制約とは、対応する親なしの*子行*が存在しないことだけを意味します。言い換えれば、同時に存在する必要があります。残念ながら、SQLはこれをサポートすることができず、実際に親の行が最初に必要です。これは細部のように見えるかもしれませんが、実際にはSQLの参照整合性サポートは、この1つの単純な制限の結果として真剣に弱まっています。 – sqlvogel

0

すべてのDBMSでこれが行われているかどうかはわかりませんが、トランザクション内でインバリアントを破ることができ、コミットポイントで正しく機能する必要があると思います。

0

これはSQLをサポートできないという基本的な制限です。一番近いのは、例えば遅延可能制約を使用して、一時的に1つ以上の制約を一時的に無効にすることです。

考えられる妥協点は、参照元の列を独自の表に削除して、現在の両方の表を参照することです。次に、他のものが移入された後にのみ、この新しい表に行を挿入します。制約条件はもちろん選択可能です。実装するにはnull可能な列は必要ありません。