Examinando um banco de dados, deparei-me com uma tabela que usava sua chave primária como uma chave estrangeira para si mesma.
Vi que uma tabela pode ter uma chave estrangeira para criar uma estrutura hierárquica, mas usaria outra coluna para fazer referência à chave primária.
Como a chave primária é única, nessa situação a linha não seria capaz de apontar de volta para si mesma? Isso parece ser um elo tautológico, pois se eu já tenho a linha, então já a tenho.
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 as duas metades da definição.
sql-server
foreign-key
primary-key
Aaroninus
fonte
fonte
Respostas:
Como você disse. Uma
FOREIGN KEY
restrição que faz referência à mesma tabela geralmente é para uma estrutura hierárquica 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; portanto, esse
ManagerId
é realmente oEmployeeId
do gerente.Agora, por outro lado, se você quer dizer que alguém usou a
EmployeeId
chave estrangeira na tabela Employee , provavelmente foi um erro . Fiz um teste e é possível, mas não teria nenhum uso real.fonte
Acabei de encontrar uma chave estrangeira no meu próprio banco de dados e deve ter sido eu mesma criando-a. Eu acho que isso aconteceu por acidente. Se eu clicar em "Nova chave estrangeira" no menu de contexto de uma tabela com chave primária (no Management Studio, SQL 2014 Express), isso já criará automaticamente uma chave estrangeira referente a si mesma. Ver abaixo:
Se eu não perceber que devo alterá-lo em vez de adicionar um novo, ele permanecerá lá. Ou, se eu simplesmente clicar no botão [Fechar], o que significa que seria como um [Cancelar], a chave estrangeira ainda será criada após salvar a definição da tabela.
Então, para mim, uma chave estrangeira não faz sentido e pode ser removida.
fonte
Talvez o designer quisesse desativar o uso de
TRUNCATE TABLE
?TRUNCATE TABLE
não pode ser usado em uma tabela com restrição de chave estrangeira para outra tabela, embora possa ser usado se houver chaves estrangeiras autorreferenciais . Na documentação para TRUNCATE TABLE (Transact-SQL) :Uma
DELETE
instrução sem umaWHERE
cláusula tem um efeito semelhante aTRUNCATE TABLE
(removendo todas as linhas da tabela), mas aDELETE
instrução aciona os gatilhos de exclusão, o que pode ser um motivo para permitirDELETE
mas nãoTRUNCATE TABLE
.Eu faria isso usando permissões (
DELETE
requer permissão para excluir,TRUNCATE TABLE
requer permissão para alterar a tabela), mas talvez haja algum motivo pelo qual o designer não possa fazer isso?Nota: Embora o que o designer tenha feito realmente não desabilite o uso
TRUNCATE TABLE
, ainda estou especulando que essa era a intenção deles.fonte