Oracle
 sql >> Database >  >> RDS >> Oracle

Applica un vincolo di chiave esterna alle colonne della stessa tabella

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.

  1. Scopri come puoi.
  2. 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?