2009-05-06 13 views
0

これがうまく設計されているかどうかはわかりません。テーブルAがテーブルBにデポジットするときにテーブルAに新しいレコードを挿入する方法

  • 私は私がしたSQL Server 2008の

を使用しています:

TableA (TableA_ID int identity PK, Value varchar(10), TableB_ID PK not null) 
TableB (TableB_ID int identity PK, Value varchar(10), TableA_ID PK not null) 

目標は単純です:

  • TableAのは、少なくともある場合にのみ行を持つことができますTableAに関連付けられたTableBの1行。
  • 表Bの各行には、表Aに関連する行がなければなりません。

テーブルAは「親テーブル」であり、テーブルBは「子供用テーブル」です。親は1人以上の子供を持つ必要があり、各子は1人しか親を持たないようなものです。

これは正しいですか?

私が抱えている問題は、INSERT文を実行しようとするときです。これが正しい場合、INSERTをどのようにしたらよいですか?一時的に制約を無効にする?

ありがとうございます!私は親が子供に依存しない

+0

親が子供を持つ必要がありますか?私はまだこの要件が存在する状況に出くわしました... – BenAlabaster

+0

はい...これは変ですが、 –

+0

私は実際に驚いています。SQL Serverは遅延外部キー制約をサポートできません。ああ、毎日何か新しいことを学ぶ! –

答えて

0

を挿入しようとすると、

私がいる問題があります。表Aの表Bの参照を削除する必要があります。

0

循環依存関係があります。これらは宣言的な強制ではうまく機能しません。挿入するたびに制約を無効にする必要があります。

1
TableA (TableA_ID int identity PK, Value varchar(10)) 
TableB (TableB_ID int identity PK, Value varchar(10), TableA_ID not null) 

を親として、テーブルaはテーブルaを必要とするため、テーブルbを参照する必要はありません。これは1対多の関係と呼ばれます。

ので、表中のあなたは、これらの値を持っているかもしれませんA:

1 a 
2 b 
3 c 

と表で、あなたはこれらのかもしれないB:表Aからのデータを表示するために、クエリを作ることができる

1 asdf 1 
2 sdfg 1 
3 pof 2 
4 dfgbsd 3 

をこれは:

select b.TableB_ID, b.Value, a.TableA_ID, a.Value 
from TableB b 
inner join TableA 
on b.TableA_ID=a.TableA_ID 
0

これは珍しい要件です。

テーブルaからテーブルbまでの正規の外部キーを親とbで作成します(これは実際には必須です)子供。

テーブルをレコードが挿入されたときにテーブルbにレコードを挿入するトリガをテーブルaに追加します(存在しない場合)。テーブルbの最後の関連レコードが削除された場合は、レコードを削除する別のトリガをテーブルbに追加します。

代わりに、ストアドプロシージャの両方のテーブルに挿入を配置することができます。 procを介して以外のテーブルへのすべての挿入権を削除します。最後のレコードが削除された場合はレコードが削除されることを保証するために、tableaからtablebまでの外部キー関係とテーブルbのトリガーが必要です。しかし、この場合は、テーブルaの引き金を外すことができます。

テーブルbの情報がテーブルaのトリガから見つからない限り、最初のシナリオを使用します。たとえば、1つ以上の必須フィールドにeoutフォームテーブルaを作成できます。

0

私は、プロセスに挿入を挿入します:制約を無効にし、データを挿入し、制約を有効にします。ただし、制約が無効になっている間、これが唯一のトランザクションであることを確認する必要があります。

これは、独立性レベルをSERIALIZABLEにすることで達成できますが、それは順番に並行性を損なう可能性があります。

kev

関連する問題