1

次のような 3 つのテーブルがあるとします。

Person
PersonId INT [主キー、一意のクラスター idx、ID はい]
PersonName VARCHAR(50) [null 以外]
ContactId INT [一意の非クラスター idx、null 以外、Contact テーブルの ContactId 列への FK]

Company
CompanyId INT [主キー、一意のクラスター idx、ID はい]
CompanyName VARCHAR(100) [null 以外]
ContactId INT [一意の非クラスター idx、null 以外、Contact テーブルの ContactId 列への外部キー]

Contact
ContactId INT [PK、一意のクラスター idx、ID はい]
CreatedDate DATETIME [null 以外、デフォルト値 getdate()]

次の 3 つの挿入操作 (すべて空のテーブルから開始) で、目的の最終結果を表示します...

私は行を Person に挿入し、最終的には次のようにしたいと考えています。

Person テーブル-
PersonId 1
PersonName 'First Person'
ContactId 1

連絡先テーブル-
ContactId 1
CreatedDate getdate() 値

次に、会社に行を挿入し、最終的に次のようにしたいと考えています。

Company テーブル- CompanyId 1
CompanyName 'First Company'
ContactId 2

連絡先テーブル- ContactId 2
CreatedDate getdate() 値

私は 2 番目の行を Person に挿入し、最終的に次のようにしたいと考えています。

Person テーブル- PersonId 2
PersonName 'Second Person'
ContactId 3

連絡先テーブル- ContactId 3
CreatedDate getdate() 値

上記により、私が達成しようとしていること、つまり、いわば一種の「一意の値ジェネレーター」タイプのメカニズムとして Contact テーブルを使用したいことが明確になることを願っています。 (または、同様の ContactId 列を入れたい追加のテーブル)、それらのテーブルのいずれか/すべての各 ContactId 値は一意になります。

これを達成するための最も効率的な方法は何でしょうか? アプリケーション コードから挿入操作を 1 回だけ実行できるように、Person テーブルと Company テーブルのトリガーを使用してこれを行うことは可能ですか (そうであれば、トリガー コードはどのようになりますか)。または、最初に Contact テーブルに行を挿入し、scope_identity() 値を取得してから、Person への挿入で ContactId 値にその値を使用するという、アプリケーション コードから常に複数の I/O 操作を行う必要がありますか?または会社?または、それらのいずれよりも優れた他の方法論はありますか?

どんな洞察も大歓迎です!

4

1 に答える 1

0

contactId のシーケンスが必要であり、トリガーに基づいて contactId のシーケンスから値を挿入する必要があります

于 2013-02-15T13:36:03.183 に答える