¿Pregunta SQL sobre hacer referencia a la misma tabla?

Una tabla autorreferenciada es una tabla que tiene una referencia FK apuntando a sí misma. Lo tipico

ejemplo es una tabla de Empleados donde cada registro hace referencia a otro registro en la misma tabla que un registro

supervisor. SQL Server no impide dicha estructura, pero esta arquitectura de base de datos es muy importante

recomienda en contra. Causa problemas al usar rutinas genéricas para examinar la base de datos

jerarquía. Si una rutina intenta seguir cada referencia, entonces una tabla de autorreferencia causa un

bucle sin fin (referencia circular). Si una rutina ignora específicamente las auto-referencias, entonces no puede

Realizar un análisis completo de las relaciones de la tabla. Ambas situaciones son muy inaceptables y

Esta arquitectura de base de datos sugiere que nunca se utilizarán autorreferencias. Ellos pueden ser

evitado con una modificación bastante simple del modelo de datos. El modelo de datos puede usar un conjunto de

tres tablas en lugar de una sola tabla de Empleados que incluye una autorreferencia. Las tres mesas

se llamaría Empleado, Supervisor y Cargo.

  - Creación de tablas con claves externas mutuas.
 CREAR TABLA public.table1
 (
    clave grande, 
    ref bigint, 
    CLAVE PRIMARIA (clave)
 );

 CREAR TABLA public.table2
 (
    clave grande, 
    ref bigint, 
    CLAVE PRIMARIA (clave)
 );

 ALTER TABLE public.table1
   AGREGAR RESTRICCIÓN table1_fkey CLAVE EXTRANJERA (ref) REFERENCIAS public.table2 (key)
    EN ACTUALIZACIÓN SIN ACCIÓN EN ELIMINAR SIN ACCIÓN;
 CREAR ÍNDICE fki_table1_fkey
   EN public.table1 (ref);

 ALTER TABLE public.table2
   AGREGAR RESTRICCIÓN table2_fkey CLAVE EXTRANJERA (ref) REFERENCIAS public.table1 (key)
    EN ACTUALIZACIÓN SIN ACCIÓN EN ELIMINAR SIN ACCIÓN;
 CREAR ÍNDICE fki_table2_fkey
   EN public.table2 (ref);

 - Inserción ilegal
 INSERTAR EN LOS VALORES public.table1 (key, ref) (1, 1);
 --ERROR: insertar o actualizar en la tabla "tabla1" viola la restricción de clave externa "tabla1_clave"
 --DETAIL: Key (ref) = (1) no está presente en la tabla "table2".

 - Una forma de insertar registros en ambas tablas.
 INSERTAR EN LOS VALORES public.table1 (key, ref) (1, NULL);
 - La consulta se devolvió correctamente: una fila afectada, 11 ms de tiempo de ejecución.

 INSERTAR EN VALORES public.table2 (key, ref) (2, NULL);
 - La consulta se devolvió correctamente: una fila afectada, 11 ms de tiempo de ejecución.

 ACTUALIZACIÓN public.table1 SET ref = 2 WHERE key = 1;
 - La consulta se devolvió correctamente: una fila afectada, 10 ms de tiempo de ejecución.

 ACTUALIZACIÓN public.table2 SET ref = 1 WHERE key = 2;
 - La consulta se devolvió correctamente: una fila afectada, 11 ms de tiempo de ejecución.

 SELECCIONAR * DESDE public.table1;
 --1 fila recuperada.  (1, 2)

 SELECCIONAR * DESDE public.table2;
 --1 fila recuperada.  (2, 1)