sql >> Databasteknik >  >> RDS >> Oracle

Genomför en begränsning med främmande nyckel för kolumner i samma tabell

Oracle kallar detta en självrefererande integritetsbegränsning. Dokumentationen finns här för en beskrivning,

Du skapar en självrefererande restriktion på samma sätt som en vanlig:

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

Jag antar att ditt manager_no är nullbar. Jag har lagt till null här som en delete cascade skulle förmodligen utplåna en betydande del av ditt bord.

Jag kan inte tänka mig ett bättre sätt att göra det här. Att ta bort en chef bör inte leda till att alla deras anställda raderas så du måste set null och har en trigger på bordet för att varna dig för alla som saknar manager.

Jag gillar alltid den här sidan, som är bra för enkla referenser. och glöm inte att ha ett index på FK också, annars kommer Tom att skrika på dig :-).

Man kan också använda standard Oracle-syntax för att skapa en självrefererande FK i skapa tabellsatsen, som skulle se ut som följande.

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 nedan:

Även om du kan göra detta i ett påstående är att inte kunna ändra en tabell ett ganska löjligt tillstånd. Du bör definitivt analysera en tabell som du kommer att välja från och du kommer fortfarande att vilja ha ett index på den främmande nyckeln (och möjligen fler kolumner och/eller fler index) annars när du använder den främmande nyckeln du ska göra en fullbordsskanning. Se min länk till asktom ovan.

Om du inte kan ändra en tabell bör du göra det i fallande ordning efter betydelse.

  1. Ta reda på hur du kan.
  2. Ändra din DB-design eftersom en FK bör ha ett index och om du inte kan ha ett så är FK:er förmodligen inte rätt väg att gå. Kanske ha en tabell över chefer och en tabell över anställda?


  1. Oracle till PostgreSQL:Reasons to Migrate

  2. Hur skapar man en slumpmässig sträng som är lämplig för ett sessions-ID i PostgreSQL?

  3. Oracle - Vilken TNS Names-fil använder jag?

  4. MySQL PHP-inkompatibilitet