Oracle tomu říká omezení vlastní referenční integrity. Dokumentace je zde pro popis,
Samoreferenční omezení vytvoříte stejným způsobem jako normální:
alter table employees
add constraint employees_emp_man_fk
foreign key ( manager_no )
references employees ( emp_id )
on delete set null
;
Předpokládám, že vaše manager_no
je nulovatelné. Přidal jsem sem set null jako delete cascade
by pravděpodobně zničilo významnou část vašeho stolu.
Nenapadá mě lepší způsob, jak to udělat. Smazání manažera by nemělo vést ke smazání všech jeho zaměstnanců, takže musíte set null
a mít na stole spoušť, která vás upozorní na kohokoli bez manažera.
Vždy se mi líbí tento web, který je dobrý pro jednoduché reference. a nezapomeň mít index i na FK nebo na tebe Tom zařve :-).
Je také možné použít standardní syntaxi Oracle k vytvoření self-referenčního FK v příkazu create table, který by vypadal následovně.
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
);
UPRAVIT:
V odpovědi na níže uvedený komentář @popstack:
I když to můžete udělat jedním prohlášením, neschopnost změnit tabulku je docela směšný stav. Určitě byste měli analyzovat tabulku, ze které budete vybírat, a stále budete chtít index na cizím klíči (a možná více sloupců a / nebo více indexů), jinak kdykoli použijete cizí klíč, který se chystáte udělat kompletní skenování tabulky. Viz můj odkaz na asktom výše.
Pokud nemůžete tabulku změnit, měli byste to udělat v sestupném pořadí podle důležitosti.
- Zjistěte, jak můžete.
- Změňte svůj návrh DB, protože FK by měl mít index, a pokud jej nemůžete mít, pak FK pravděpodobně nejsou správnou cestou. Možná mít tabulku manažerů a tabulku zaměstnanců?