En parcourant une base de données, je suis tombé sur une table qui utilisait sa clé primaire comme clé étrangère pour elle-même.
J'ai vu qu'une table peut avoir une clé étrangère pour construire une structure de hiérarchie, mais elle utiliserait une autre colonne pour référencer la clé primaire.
Étant donné que la clé primaire est unique, dans cette situation, la ligne ne pourrait-elle pas seulement pointer vers elle-même? Cela semble être un lien tautologique, car si j'ai déjà la rangée, alors j'ai déjà la rangée.
Y a-t-il une raison pour laquelle cela serait fait?
Je suis certain que la contrainte est écrite de cette façon (pas seulement en regardant le diagramme) car le même tableau et la même colonne sont utilisés pour les deux moitiés de la définition.
la source
Réponses:
Comme tu as dis. Une
FOREIGN KEY
contrainte référençant la même table concerne généralement une structure hiérarchique et utilise une autre colonne pour référencer la clé primaire. Un bon exemple est un tableau des employés:Donc, dans ce cas, il y a une clé étrangère de la table sur elle-même. Tous les gestionnaires sont également employés pour l'
ManagerId
est en fait leEmployeeId
du gestionnaire.Maintenant, d'autre part, si vous voulez dire que quelqu'un a utilisé la
EmployeeId
clé étrangère pour revenir à la table des employés, c'était probablement une erreur . J'ai fait un test et c'est possible mais ça n'aurait pas vraiment d'utilité.la source
Je viens de trouver une telle clé étrangère dans ma propre base de données et ce doit être moi-même qui l'a créée. Je pense que c'est arrivé par accident. Si je clique sur "Nouvelle clé étrangère" dans le menu contextuel d'une table avec une clé primaire (dans Management Studio, SQL 2014 Express), cela crée déjà automatiquement une telle clé étrangère se référant à elle-même. Voir ci-dessous:
Si je ne me rends pas compte que je devrais le modifier au lieu d'en ajouter un nouveau, il y restera. Ou, si je clique simplement sur le bouton [Fermer] ce qui signifie que ce serait comme un [Annuler], la clé étrangère sera toujours créée après avoir enregistré la définition de la table.
Donc, pour moi, une telle clé étrangère n'a aucun sens et peut être supprimée.
la source
Peut-être que le concepteur voulait désactiver l'utilisation de
TRUNCATE TABLE
?TRUNCATE TABLE
ne peut pas être utilisé sur une table avec une contrainte de clé étrangère vers une autre table bien qu'il puisse être utilisé s'il existe des clés étrangères auto-référentielles . Dans la documentation de TRUNCATE TABLE (Transact-SQL) :Une
DELETE
instruction sansWHERE
clause a un effet similaire à aTRUNCATE TABLE
(suppression de toutes les lignes du tableau) mais l'DELETE
instruction déclenche des déclencheurs de suppression, ce qui peut être une raison pour autoriserDELETE
mais pasTRUNCATE TABLE
.Je le ferais en utilisant des autorisations (
DELETE
nécessite une autorisation de suppression, une autorisation deTRUNCATE TABLE
modification de table), mais peut-être qu'il y a une raison pour laquelle le concepteur n'a pas pu le faire?Remarque: Même si ce que le concepteur a fait ne désactive pas réellement l'utilisation de
TRUNCATE TABLE
, je spécule toujours que c'était leur intention.la source