Oracle называет это самореференциальным ограничением целостности. Документация here для описания,
Вы создаете самосправочные ограничения таким же образом, вы нормальные один:
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
и иметь триггер в таблице, чтобы предупредить вас обо всех, у кого нет менеджера.
Мне всегда нравится this сайт, который хорош для простых ссылок. и не забудьте также иметь индекс на FK, или Tom будет кричать на вас :-).
Можно также использовать стандартный синтаксис Oracle для создания самореферентного FK в инструкции create table, который будет выглядеть следующим образом.
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:
В ответе на @ popstack Замечание ниже:
Хотя вы можете сделать это в одном заявлении не в состоянии изменить таблицу довольно смешное положение дел. Вы должны определенно проанализировать таблицу, которую вы собираетесь выбирать, и вам по-прежнему нужен индекс внешнего ключа (и, возможно, больше столбцов и/или более индексов), в противном случае всякий раз, когда вы используете внешний ключ, который вы собираетесь делать полное сканирование таблицы. См. Мою ссылку на asktom выше.
Если вы не можете изменить таблицу, вы должны в порядке убывания важности.
- Узнайте, как вы можете.
- Измените свой дизайн БД, поскольку FK должен иметь индекс, и если у вас не может быть одного, то FK, вероятно, не путь. Может быть, есть таблица менеджеров и таблица сотрудников?
несколько ...! Любые другие методы/предложения для оракула? –
Я никогда не пробовал, но я думаю, что работа с TABLE_NAME вместо «parent_table_name» должна работать! – instanceOfObject
Это недействительный оператор для Oracle –