Oracle нарича това ограничение за самореферентна цялост. Документацията е тук за описание,
Вие създавате самореферентно ограничение по същия начин, по който бихте направили нормално:
alter table employees
add constraint employees_emp_man_fk
foreign key ( manager_no )
references employees ( emp_id )
on delete set null
;
Предполагам, че вашият manager_no
е нула. Добавих set null тук като delete cascade
вероятно ще изтрие значително количество от вашата маса.
Не мога да измисля по-добър начин да направя това. Изтриването на мениджър не трябва да води до изтриване на всички техни служители, така че трябва да set null
и има тригер на масата, за да ви предупреди за всеки, който няма мениджър.
Винаги харесвам този сайт, който е добър за прости препратки. и не забравяйте да имате индекс на FK, или Том ще ви крещи :-).
Човек може също да използва стандартен синтаксис на Oracle, за да създаде самореферентен FK в израза за създаване на таблица, който би изглеждал така.
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
);
РЕДАКТИРАНЕ:
В отговор на коментара на @popstack по-долу:
Въпреки че можете да направите това с едно изявление да не можете да промените таблица е доста нелепо положение на нещата. Определено трябва да анализирате таблица, от която ще избирате, и все пак ще искате индекс на външния ключ (и евентуално повече колони и/или повече индекси) в противен случай всеки път, когато използвате външния ключ, който ще направите пълно сканиране на таблицата. Вижте моята връзка към asktom по-горе.
Ако не можете да промените таблица, тогава трябва, в низходящ ред по важност.
- Разберете как можете.
- Променете дизайна на DB, тъй като FK трябва да има индекс и ако не можете да имате такъв, тогава FK вероятно не са подходящият начин. Може би има маса с мениджъри и маса със служители?