Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erzwingen Sie eine Fremdschlüsseleinschränkung für Spalten derselben Tabelle

Oracle nennt dies eine selbstreferenzielle Integritätsbedingung. Die Dokumentation ist hier für eine Beschreibung,

Sie erstellen eine selbstreferenzielle Einschränkung auf die gleiche Weise wie eine normale Einschränkung:

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

Ich gehe davon aus, dass Ihre manager_no ist nullfähig. Ich habe set null hier als delete cascade hinzugefügt würde wahrscheinlich einen erheblichen Teil Ihrer Tabelle löschen.

Ich kann mir keinen besseren Weg vorstellen, dies zu tun. Das Löschen eines Managers sollte nicht zum Löschen aller seiner Mitarbeiter führen, daher müssen Sie set null und haben Sie einen Trigger auf dem Tisch, um Sie auf jeden ohne Manager aufmerksam zu machen.

Ich mag diese Seite immer, die gut für einfache Referenzen ist. und vergiss nicht, auch einen Index auf dem FK zu haben, oder Tom wird dich anschreien :-).

Man kann auch die standardmäßige Oracle-Syntax verwenden, um einen selbstreferenziellen FK in der create table-Anweisung zu erstellen, die wie folgt aussehen würde.

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
 );

BEARBEITEN:

Als Antwort auf den Kommentar von @popstack unten:

Während Sie dies in einer Anweisung tun können, ist es ein ziemlich lächerlicher Zustand, eine Tabelle nicht ändern zu können. Sie sollten auf jeden Fall eine Tabelle analysieren, aus der Sie auswählen werden, und Sie möchten immer noch einen Index für den Fremdschlüssel (und möglicherweise mehr Spalten und / oder mehr Indizes), ansonsten wann immer Sie den Fremdschlüssel verwenden, den Sie tun werden ein vollständiger Tabellenscan. Siehe meinen Link zu asktom oben.

Wenn Sie eine Tabelle nicht ändern können, sollten Sie dies in absteigender Reihenfolge der Wichtigkeit tun.

  1. Finden Sie heraus, wie Sie können.
  2. Ändern Sie Ihr DB-Design, da ein FK einen Index haben sollte und wenn Sie keinen haben können, dann sind FKs wahrscheinlich nicht der richtige Weg. Vielleicht haben Sie eine Tabelle mit Managern und eine Tabelle mit Mitarbeitern?