Por que as tabelas temporárias não podem referenciar tabelas não temporárias no PostgreSQL? Quando eu executo o seguinte
CREATE TABLE foo ( a int PRIMARY KEY );
CREATE TEMP TABLE bar ( a int REFERENCES foo );
Eu recebo,
ERRO: restrições em tabelas temporárias podem referenciar apenas tabelas temporárias
Eu pensei que isso costumava funcionar, então voltei para o PostgreSQL 8.4 e vejo que mesmo assim costumava dar erro,
ERRO: não é possível fazer referência à tabela permanente da restrição de tabela temporária
Mas por que isso? Por que uma tabela temporária não pode fazer referência a uma tabela não temporária.
Existem dois lados para uma restrição de chave estrangeira:
O Postgres implementa isso instalando gatilhos em ambas as tabelas para realizar as verificações de existência. Mas o gatilho pai simplesmente não funcionará se o filho for uma tabela temporária: o gatilho precisa ser acionado para todos os usuários do banco de dados para garantir a integridade referencial, mas os dados da tabela temporária só são visíveis dentro da sessão que o criou, então o restrição não pode ser imposta.
Mesmo que fosse possível, é provavelmente um pouco intrusivo; raramente é desejável ter uma
DELETE
falha no pai apenas porque algum outro usuário está fazendo referência a ela de um conjunto de dados temporário. Mas se você realmente precisar manter a integridade nesse caso, poderá obter o mesmo efeito bloqueando os registros pai com uma extensãoSELECT ... FOR KEY SHARE
.