¿Por qué una tabla usaría su clave primaria como una clave externa para sí misma?


21

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?

Mesa unida a sí misma

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.


66
Probablemente a través del uso del diseñador es mi teoría
Martin Smith

Respuestas:


28

Como dijiste. Una FOREIGN KEYrestricció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:

EmployeeId    Int     Primary Key
EmployeeName  String
ManagerId     Int     Foreign key going back to the EmployeeId

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 ManagerIdque en realidad es EmployeeIddel gerente.

Ahora, por otro lado, si quiere decir que alguien usó la EmployeeIdclave 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.

CREATE TABLE Employee (EmployeeId Int PRIMARY KEY,
                        EmployeeName varchar(50),
                        ManagerId Int);


ALTER TABLE Employee ADD CONSTRAINT fk_employee 
    FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId);

1
En este caso, colocar una restricción en el Id. De administrador en relación con el Id. De empleado podría ser beneficioso si el Administrador se "separara". No permitiría la eliminación de la fila si se configura de esa manera. No digo que lo haría de esa manera, pero podría tener algún beneficio si su aplicación dependiera de que los empleados tuvieran gerentes.
zgr024

6

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:

ingrese la descripción de la imagen aquí

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.


Es posible que desee crear un FK y en el proceso se da cuenta de que la otra tabla aún no ha establecido su PK, por lo que cancela, vaya a la otra tabla y luego, por alguna razón, olvida continuar con el proceso FK. Ahí tienes tu FK recursivo.
Andrew

4

Quizás el diseñador quería desactivar el uso de TRUNCATE TABLE?

TRUNCATE TABLEno 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) :

Extracto de BOL

Una DELETEdeclaración sin una WHEREcláusula tiene un efecto similar a un TRUNCATE TABLE(eliminando todas las filas de la tabla) pero la DELETEdeclaración dispara desencadenantes de eliminación, lo que podría ser una razón para permitir DELETEpero no TRUNCATE TABLE.

Lo haría usando permisos ( DELETErequiere permiso de eliminación, TRUNCATE TABLErequiere 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.