Examinando um banco de dados, me deparei com uma tabela que usava sua chave primária como chave estrangeira para si mesma.
Eu vi que uma tabela pode ter uma chave estrangeira para construir uma estrutura de hierarquia, mas usaria outra coluna para referenciar a chave primária.
Como a chave primária é única, nessa situação a linha não poderia apenas apontar de volta para ela mesma? Isso parece ser um link tautológico, pois se eu já tenho a linha, já tenho a linha.
Existe alguma razão para isso ser feito?
Estou certo de que a restrição está escrita dessa maneira (não apenas olhando para o diagrama) porque a mesma tabela e coluna são usadas para ambas as metades da definição.
Como você disse. Uma
FOREIGN KEY
restrição que faz referência à mesma tabela normalmente é para uma estrutura de hierarquia e usaria outra coluna para fazer referência à chave primária. Um bom exemplo é uma tabela de funcionários:Portanto, neste caso, há uma chave estrangeira da tabela de volta para si mesma. Todos os gerentes também são funcionários, então o
ManagerId
é realmente oEmployeeId
do gerente.Agora, por outro lado, se você quer dizer que alguém usou
EmployeeId
como a chave estrangeira de volta para a tabela Employee, então provavelmente foi um erro . Eu fiz um teste e é possível, mas não teria nenhum uso real.Acabei de encontrar uma chave estrangeira no meu próprio banco de dados e deve ter sido eu mesmo criando. Acho que isso aconteceu por acaso. Se eu clicar em "Nova Chave Estrangeira" no menu de contexto de uma tabela com chave primária (dentro do Management Studio, SQL 2014 Express) isso já cria automaticamente tal chave estrangeira referindo-se a si mesma. Veja abaixo:
Se eu não perceber que devo alterar aquele em vez de adicionar um novo, ele permanecerá lá. Ou, se eu simplesmente clicar no botão [Fechar], o que significa que isso seria como um [Cancelar], a chave estrangeira ainda seria criada após salvar a definição da tabela.
Então, para mim, essa chave estrangeira não faz sentido e pode ser removida.
Talvez o designer quisesse desabilitar o uso de
TRUNCATE TABLE
?TRUNCATE TABLE
não pode ser usado em uma tabela com uma restrição de chave estrangeira para outra tabela , embora possa ser usado se houver chaves estrangeiras auto-referenciais . Da documentação para TRUNCATE TABLE (Transact-SQL) :Uma
DELETE
instrução sem umaWHERE
cláusula tem um efeito semelhante a aTRUNCATE TABLE
(removendo todas as linhas da tabela), mas aDELETE
instrução dispara gatilhos de exclusão, o que pode ser um motivo para permitir,DELETE
mas nãoTRUNCATE TABLE
.Eu faria isso usando permissões (
DELETE
requer permissão de exclusão,TRUNCATE TABLE
requer permissão de alteração de tabela), mas talvez haja algum motivo pelo qual o designer não possa fazer isso?Nota: Mesmo que o que o designer tenha feito não desabilite o uso de
TRUNCATE TABLE
, ainda estou especulando que essa era a intenção deles.