Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Impor uma restrição de chave estrangeira a colunas da mesma tabela


A Oracle chama isso de restrição de integridade auto-referencial. A documentação está aqui para uma descrição,

Você cria uma restrição auto-referencial da mesma maneira que faria com uma restrição normal:
alter table employees
  add constraint employees_emp_man_fk
      foreign key ( manager_no )
      references employees ( emp_id )
   on delete set null
      ;

Estou assumindo que seu manager_no é anulável. Eu adicionei set null aqui como uma delete cascade provavelmente eliminaria uma quantidade significativa de sua mesa.

Não consigo pensar em uma maneira melhor de fazer isso. A exclusão de um gerente não deve resultar na exclusão de todos os funcionários, portanto, você deve set null e ter um gatilho na mesa para alertá-lo sobre qualquer pessoa sem gerente.

Eu sempre gosto deste site, que é bom para referências simples. e não se esqueça de ter um índice no FK também ou Tom vai gritar com você :-).

Também é possível utilizar a sintaxe padrão do Oracle para criar um FK auto-referencial na instrução create table, que se pareceria com o seguinte.
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:

Em resposta ao comentário de @popstack abaixo:

Embora você possa fazer isso em uma declaração, não ser capaz de alterar uma tabela é um estado de coisas bastante ridículo. Você definitivamente deve analisar uma tabela da qual você selecionará e ainda desejará um índice na chave estrangeira (e possivelmente mais colunas e/ou mais índices), caso contrário, sempre que usar a chave estrangeira, você fará uma varredura completa da tabela. Veja meu link para asktom acima.

Se você não conseguir alterar uma tabela, deve fazê-lo, em ordem decrescente de importância.
  1. Descubra como você pode.
  2. Altere seu design de banco de dados, pois um FK deve ter um índice e, se você não puder ter um, os FKs provavelmente não são o caminho a seguir. Talvez tenha uma tabela de gerentes e uma tabela de funcionários?