Oracle называют это самообращающимся ограничением целостности.Документация: здесь для описания,
Вы создаете само-ссылочное ограничение так же, как и обычное:
alter table employees
add constraint employees_emp_man_fk
foreign key ( manager_no )
references employees ( emp_id )
on delete set null
;
Я предполагаючто ваш manager_no
обнуляем.Я добавил здесь значение null, поскольку delete cascade
, вероятно, уничтожит значительную часть вашего стола.
Я не могу придумать лучшего способа сделать это.Удаление менеджера не должно приводить к удалению всех его сотрудников, поэтому вы должны set null
и иметь триггер на столе, чтобы предупредить вас о ком-либо без менеджера.
Мне всегда нравится this сайт, который хорош для простых ссылок.и не забудьте также иметь индекс на FK, или Tom будет кричать на вас: -).
Можно также использовать стандартный синтаксис 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 выше.
Если вы не можете изменить таблицу, вам следует в порядке убывания важности.
- Узнайте, как вы можете.
- Измените ваш дизайн БД, так как у FK должен быть индекс, и если у вас его нет, то FK, вероятно, не тот путь.Может быть, есть таблица руководителей и таблица сотрудников?