我知道只要SQL Server会话打开一个临时表就会存在,但为什么你不能对它们有外键限制呢?
答案 0 :(得分:5)
想象一下这种情况:您可以从临时表创建外键关系到具体表的键。外键关系的一个限制是您无法从临时表中依赖的键表中删除行。现在,通常在创建外键关系时,您知道在删除键表中的相关行之前删除依赖表行,但是存储过程或对数据库的任何其他调用如何知道从临时表中删除行?不仅不可能发现虚假的外键依赖关系,即使它可以发现关系,其他会话也无法到达临时表。这会导致delete语句出现虚假失败,因为外键约束会限制依赖行的键表。
答案 1 :(得分:2)
您可以在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
答案 2 :(得分:0)
可能是因为您不能在TempDB数据库中创建跨数据库外键约束和临时表。
除非你的意思是临时表和另一个临时表...但是当你在临时表上讨论这些约束时,你会遇到很多问题。