Eu criei várias tabelas em meu esquema público.
Ocasionalmente, preciso executar um seeder para atualizar a users
tabela quando realizo testes. Para fazer isso, estou executando TRUNCATE TABLE users RESTART IDENTITY CASCADE
.
No entanto, não quero que outras tabelas, exceto aquelas relacionadas à users
tabela, sejam afetadas. A única chave estrangeira que faz referência à users
tabela está na teams
tabela que faz referência users
a owner_id
. A teams
tabela trunca como esperado.
O que não é esperado é que a attributes
tabela também seja truncada por TRUNCATE TABLE users RESTART IDENTITY CASCADE
.
A attributes
tabela tem uma chave estrangeira na accounts
tabela que faz referência à users
tabela. No entanto, na attributes
tabela, TODOS account_id
os valores são NULL
, portanto, não há nenhuma referência real em nenhum dos registros para um registro específico na accounts
tabela. Na verdade, no momento da execução da consulta truncada, toda a accounts
tabela já está vazia.
Como então está TRUNCATE TABLE users RESTART IDENTITY CASCADE
fazendo com que minha tabela de atributos seja truncada com base em NULL
chaves estrangeiras?
Eu acho
TRUNCATE ... CASCADE
que não faz nenhuma verificação de referência em valores de chave estrangeira , isso anularia o propósito. A mera presença de restrições de integridade referencial conectadasattributes
ausers
viaaccounts
faz com que todas as três (e possivelmente mais) tabelas sejam truncadas (o que você teria notado seaccounts
não estivesse vazia).