sql >> Base de Datos >  >> RDS >> Oracle

Aplicar una restricción de clave externa a las columnas de la misma tabla

Oracle llama a esto una restricción de integridad autorreferencial. La documentación está aquí para una descripción,

Crea una restricción autorreferencial de la misma manera que lo haría con una normal:

alter table employees
  add constraint employees_emp_man_fk
      foreign key ( manager_no )
      references employees ( emp_id )
   on delete set null
      ;

Supongo que su manager_no es anulable. He agregado set null aquí como delete cascade probablemente acabaría con una cantidad significativa de su mesa.

No puedo pensar en una mejor manera de hacer esto. La eliminación de un gerente no debería resultar en la eliminación de todos sus empleados, por lo que debe set null y tenga un disparador en la mesa para alertarlo sobre cualquier persona sin gerente.

Siempre me ha gustado este sitio, que es bueno para referencias simples. y no olvides tener un índice en el FK también o Tom te gritará :-).

También se puede utilizar la sintaxis estándar de Oracle para crear un FK autorreferencial en la declaración de creación de tabla, que se vería así.

create table employees
 ( emp_id number
 , other_columns ...
 , manager_no number
 , constraint employees_pk 
    primary key (emp_id)
 , constraint employees_man_emp_fk
    foreign key ( manager_no )
    references employees ( emp_id )
    on delete set null
 );

EDITAR:

En respuesta al comentario de @popstack a continuación:

Si bien puede hacer esto en una declaración, no poder alterar una tabla es una situación bastante ridícula. Definitivamente debe analizar una tabla de la que va a seleccionar y aún querrá un índice en la clave externa (y posiblemente más columnas y / o más índices) de lo contrario, cada vez que use la clave externa que va a hacer un escaneo completo de la tabla. Vea mi enlace a asktom arriba.

Si no puede modificar una tabla, debería hacerlo, en orden descendente de importancia.

  1. Descubre cómo puedes hacerlo.
  2. Cambie el diseño de su base de datos, ya que un FK debe tener un índice y, si no puede tener uno, es probable que los FK no sean el camino a seguir. ¿Quizás tener una mesa de gerentes y una mesa de empleados?