次のような 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 操作を行う必要がありますか?または会社?または、それらのいずれよりも優れた他の方法論はありますか?
どんな洞察も大歓迎です!