0

1対1の関係のみを作成する方法を知っています 問題は、両方のテーブルの行を要求することです。たとえば、テーブルがあります

emp_table => key1, key2, name, description
emp_address_table => key1, key2, address

システムは住所に必須の制約を課さないため、従業員は自分の住所を持たずに存在する可能性があります。または、従業員は最大1つの住所を持つことができます。

1:1(0) の関係

SQL Server 2008でそれを行う方法を教えてください

4

4 に答える 4

2

2 つの行を同時に挿入することはできないため、子行の存在を強制する制約を設定することはできません。つまり、最初に従業員を挿入するか、従業員の住所行を挿入するかにかかわらず、この時点で無効な制約が発生します。

したがって、SQL のすべての制約は「0 以上」であり、「1 以上」または「正確に 1」になることはありません。

UNIQUEテーブルの外部キー列に制約を追加することで、「0 または 1」制約を適用できemp_addressます。これによりemp_address、特定の従業員を参照する行が最大で 1 つになるようになります。

于 2012-05-14T11:04:09.157 に答える
1

関連テーブルを使用します。とにかくそれはより良い練習であり、それを使用して 0 から N の関係を簡単に実装することもできます。

  • 関連付けテーブルに行がない場合は 0:0 を表します
  • エンティティごとに関連付けテーブルに 1 つの行が存在することは、1 対 1 を表します
  • 関連付けテーブル (エンティティごと) 内の複数の行の存在は、1 対多を表します

* emp_table*

key1
key2
name
description

*アドレステーブル*

addr_key
address

* emp_address_table*

key1
key2
addr_key

関連テーブルで、employee テーブルへkey1の外部キー参照と、address テーブルへの外部キー参照を作成します。1 対 1 の関係を強制する場合は、関連付けテーブルに一意の制約を作成します。それ以外の場合は、一意の制約をそのままにして、0 対多の関係を表します。key2addr_keykey1, key2

于 2012-05-14T11:11:03.547 に答える
0

制約を使用して、子テーブルに行を強制することはできません。(最初に行を親テーブルに挿入してから子テーブルに挿入するため、1回の操作ではなく2回の操作である可能性が高いため)

ただし、ストアド プロシージャを使用してデータを挿入したり、プロシージャ内で検証を実行したりできます。

于 2012-05-14T11:08:27.697 に答える
0

試す

SELECT * 
FROM emp_table et 
LEFT OUTER JOIN emp_address_table edt ON et.key1 = edt.key1 AND et.key2 = edt.key2
于 2012-05-14T11:05:35.987 に答える