为什么临时表不能引用 PostgreSQL 中的常规(非临时)表?

Eva*_*oll 2 postgresql temporary-tables

为什么临时表不能引用 PostgreSQL 中的非临时表?当我运行以下

CREATE TABLE foo ( a int PRIMARY KEY );
CREATE TEMP TABLE bar ( a int REFERENCES foo );
Run Code Online (Sandbox Code Playgroud)

我明白了,

错误:对临时表的约束只能引用临时表

我认为这曾经有效,所以我回到 PostgreSQL 8.4 并且我看到即使那时它曾经出错,

错误:无法从临时表约束引用永久表

这是为什么?为什么临时表不能引用非临时表。

Nic*_*nes 7

外键约束有两个方面:

  • 插入子记录(或更新其外键)时,父记录必须存在
  • 删除父记录(或更新其主键)时,子记录不得存在

Postgres 通过在两个表上安装触发器来执行存在检查来实现这一点。但是,如果子表是临时表,则父触发器根本无法工作:触发器需要为所有数据库用户触发以保证参照完整性,但临时表数据仅在创建它的会话中可见,因此不能强制执行约束。

即使有可能,也可能有点过于侵入性;很少DELETE会因为其他用户从临时数据集中引用它而导致父级失败。但是,如果您真的需要在这种情况下保持完整性,您可以通过使用SELECT ... FOR KEY SHARE.