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.
- Descubra como você pode.
- 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?