Oracle chiama questo un vincolo di integrità autoreferenziale. La documentazione è qui per una descrizione,
Crei un vincolo autoreferenziale nello stesso modo in cui lo faresti con uno normale:
alter table employees
add constraint employees_emp_man_fk
foreign key ( manager_no )
references employees ( emp_id )
on delete set null
;
Presumo che il tuo manager_no
è nullable. Ho aggiunto set null qui come delete cascade
probabilmente cancellerebbe una quantità significativa della tua tabella.
Non riesco a pensare a un modo migliore per farlo. L'eliminazione di un manager non dovrebbe comportare l'eliminazione di tutti i suoi dipendenti, quindi devi set null
e avere un trigger sul tavolo per avvisarti di chiunque non abbia un manager.
Mi piace sempre questo sito, che va bene per semplici riferimenti. e non dimenticare di avere un indice anche sull'FK o Tom ti sgriderà :-).
Si può anche utilizzare la sintassi Oracle standard per creare un FK autoreferenziale nell'istruzione create table, che sarebbe simile alla seguente.
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
);
MODIFICA:
In risposta al commento di @popstack qui sotto:
Anche se puoi farlo in una dichiarazione, non essere in grado di alterare un tavolo è uno stato di cose abbastanza ridicolo. Dovresti assolutamente analizzare una tabella da cui selezionerai e vorrai comunque un indice sulla chiave esterna (e possibilmente più colonne e/o più indici) altrimenti ogni volta che utilizzerai la chiave esterna lo farai una scansione completa della tabella. Vedi il mio link a asktom sopra.
Se non sei in grado di modificare una tabella, dovresti farlo, in ordine decrescente di importanza.
- Scopri come puoi.
- Cambia il design del tuo DB poiché un FK dovrebbe avere un indice e se non puoi averne uno, gli FK probabilmente non sono la strada da percorrere. Forse hai un tavolo dei dirigenti e un tavolo dei dipendenti?