Mirando a través de una base de datos, me encontré con una tabla que usaba su clave primaria como una clave externa para sí misma.
He visto que una tabla puede tener una clave foránea para construir una estructura jerárquica, pero usaría otra columna para hacer referencia a la clave primaria.
Dado que la clave primaria es única, en esta situación, ¿no podría la fila solo apuntar a sí misma? Ese parece ser un enlace tautológico, ya que si ya tengo la fila, entonces ya tengo la fila.
¿Hay alguna razón para que esto se haga?
Estoy seguro de que la restricción se escribe de esa manera (no solo mirando el diagrama) porque la misma tabla y columna se usan para las dos mitades de la definición.
sql-server
foreign-key
primary-key
Aaroninus
fuente
fuente
Respuestas:
Como dijiste. Una
FOREIGN KEY
restricción que hace referencia a la misma tabla suele ser para una estructura jerárquica y usaría otra columna para hacer referencia a la clave primaria. Un buen ejemplo es una tabla de empleados:Entonces, en este caso, hay una clave externa de la tabla de regreso a sí misma. Todos los gerentes también son empleados, por lo
ManagerId
que en realidad esEmployeeId
del gerente.Ahora, por otro lado, si quiere decir que alguien usó la
EmployeeId
clave foránea para volver a la tabla de Empleados, entonces probablemente fue un error . Realicé una prueba y es posible, pero no tendría ningún uso real.fuente
Acabo de encontrar una clave externa en mi propia base de datos y debe haber sido yo misma quien la creó. Creo que esto sucedió por accidente. Si hago clic en "Nueva clave externa" en el menú contextual de una tabla con clave principal (dentro de Management Studio, SQL 2014 Express), esto ya crea automáticamente una clave externa de este tipo que se refiere a sí misma. Vea abajo:
Si luego no me doy cuenta de que debería alterar ese en lugar de agregar uno nuevo, permanecerá allí. O, si simplemente hago clic en el botón [Cerrar], lo que significa que sería como [Cancelar], la clave externa aún se crearía después de guardar la definición de la tabla.
Entonces, para mí, una clave externa de este tipo no tiene sentido y puede eliminarse.
fuente
Quizás el diseñador quería desactivar el uso de
TRUNCATE TABLE
?TRUNCATE TABLE
no se puede usar en una tabla con una restricción de clave externa a otra tabla, aunque se puede usar si hay claves externas autorreferenciales . De la documentación de TRUNCATE TABLE (Transact-SQL) :Una
DELETE
declaración sin unaWHERE
cláusula tiene un efecto similar a unTRUNCATE TABLE
(eliminando todas las filas de la tabla) pero laDELETE
declaración dispara desencadenantes de eliminación, lo que podría ser una razón para permitirDELETE
pero noTRUNCATE TABLE
.Lo haría usando permisos (
DELETE
requiere permiso de eliminación,TRUNCATE TABLE
requiere permiso de alterar tabla), pero ¿tal vez hay alguna razón por la cual el diseñador no pudo hacer esto?Nota: Aunque lo que el diseñador ha hecho no deshabilita el uso
TRUNCATE TABLE
, sigo especulando que esa fue su intención.fuente