SQL Server のセッションが開いている間だけ一時テーブルが存在することは知っていますが、外部キーを制限できないのはなぜですか?
3 に答える
次のシナリオを想像してください。一時テーブルから具象テーブルのキーへの外部キー リレーションシップを作成します。外部キー リレーションシップの制限の 1 つは、一時テーブルが依存しているキー テーブルから行を削除できないことです。一般に、外部キー リレーションシップを作成する場合、キー テーブル内の関連する行を削除する前に依存テーブルの行を削除する必要があることはわかっていますが、ストアド プロシージャやその他のデータベースへの呼び出しでは、一時テーブルから行を削除することをどのように認識しているのでしょうか。誤った外部キーの依存関係を発見できないだけでなく、他のセッションが関係を発見できたとしても、一時テーブルに到達できませんでした。これは、外部キー制約によって従属行のキー テーブルが制限されるため、delete ステートメントで誤ったエラーが発生する原因となります。
tempdb のテーブル間に外部キーを作成できます。たとえば、これを試してください:
use tempdb
create table parent
(
parent_key int primary key clustered
)
create table child
(
child_key int primary key clustered,
child_parent_key int
)
alter table child add constraint fk_child_parent foreign key (child_parent_key) references parent(parent_key)
insert into parent(parent_key) select 1
insert into child(child_key, child_parent_key) select 1, 1
insert into child(child_key, child_parent_key) select 2, 2 -- this fails because of the FK constraint
drop table child
drop table parent
クロスデータベースの外部キー制約を持つことができず、技術的に一時テーブルが TempDB データベースに作成されていることが原因である可能性があります。
一時テーブルと別の一時テーブルの間を意味しない限り...しかし、実際には、一時テーブルに対するそのような種類の制約について話すと、多くの問題が発生します。