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

Gennemtving en begrænsning med fremmednøgle til kolonner i samme tabel

Oracle kalder dette en selvrefererende integritetsbegrænsning. Dokumentationen er her for en beskrivelse,

Du opretter en selvrefererende begrænsning på samme måde som en normal:

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

Jeg antager, at dit manager_no er nullbar. Jeg har tilføjet null her som en delete cascade ville sandsynligvis udslette en betydelig del af dit bord.

Jeg kan ikke komme i tanke om en bedre måde at gøre dette på. Sletning af en leder bør ikke resultere i sletning af alle deres medarbejdere, så du skal set null og har en trigger på bordet for at advare dig til alle uden manager.

Jeg kan altid godt lide denne side, som er god til simple referencer. og glem ikke at have et indeks på FK også, ellers råber Tom af dig :-).

Man kan også bruge standard Oracle-syntaks til at skabe en selvrefererende FK i create table-sætningen, som ville se ud som følgende.

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

EDIT:

Som svar på @popstacks kommentar nedenfor:

Selvom du kan gøre dette i én erklæring, er det en ret latterlig situation, at du ikke er i stand til at ændre en tabel. Du bør helt sikkert analysere en tabel, som du skal vælge fra, og du vil stadig have et indeks på fremmednøglen (og muligvis flere kolonner og/eller flere indekser) ellers når du bruger den fremmednøgle, du vil gøre en fuld bordscanning. Se mit link til asktom ovenfor.

Hvis du ikke er i stand til at ændre en tabel, skal du i faldende rækkefølge efter vigtighed.

  1. Find ud af, hvordan du kan.
  2. Skift dit DB-design, da en FK skal have et indeks, og hvis du ikke kan have et, er FK'er sandsynligvis ikke vejen at gå. Måske have en tabel med ledere og en tabel med medarbejdere?


  1. Brug DATABASEPROPERTYEX() til at returnere databaseindstillinger i SQL Server

  2. MySQL MOD() Funktion – Udfør en Modulo Operation i MySQL

  3. Guide til designdatabase til online indkøbskurv i MySQL

  4. SQL Server 2005 Pivot på ukendt antal kolonner