5

我知道一个临时表只会在 SQL Server 会话打开时才存在,但为什么你不能对它们进行外键限制呢?

4

3 回答 3

6

想象一下这种情况:您创建了一个从临时表到具体表键的外键关系。外键关系的限制之一是您不能从临时表所依赖的键表中删除行。现在,通常当您创建外键关系时,您知道在删除键表中的相关行之前删除依赖表行,但是存储过程或对数据库的任何其他调用如何知道从临时表中删除行?不仅不可能发现虚假的外键依赖关系,其他会话即使可以发现关系也无法访问您的临时表。这会导致删除语句中的虚假失败,因为外键约束会限制依赖行的键表。

于 2014-02-20T02:17:20.110 回答
3

您可以在 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
于 2012-06-07T17:14:50.917 回答
0

可能是因为您不能有跨数据库外键约束,并且临时表在技术上是在 TempDB 数据库中创建的。

除非你的意思是在一个临时表和另一个临时表之间......但当你谈论临时表上的那些约束时,你确实会遇到很多问题。

于 2012-06-07T17:07:41.067 回答