Применение ограничения внешнего ключа для столбцов той же таблицы - PullRequest
10 голосов
/ 07 января 2012

Как применить ограничение внешнего ключа для столбцов той же таблицы в SQL при вводе значений в следующую таблицу:

сотрудник :

  • empid число,
  • номер менеджера (должен быть действующим сотрудником)

Ответы [ 3 ]

20 голосов
/ 07 января 2012

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 выше.

Если вы не можете изменить таблицу, вам следует в порядке убывания важности.

  1. Узнайте, как вы можете.
  2. Измените ваш дизайн БД, так как у FK должен быть индекс, и если у вас его нет, то FK, вероятно, не тот путь.Может быть, есть таблица руководителей и таблица сотрудников?
1 голос
/ 13 августа 2013

ЗАПРОСЫ САМОСТОЯТЕЛЬНОЙ ...

Alter table table_name ADD constraints constraints_name foreign key(column_name1,column_name2..) references table_name(column_name1,column_name2...) ON DELETE CASCADE;

EX- ALTER TABLE Employee ADD CONSTRAINTS Fr_key( mgr_no) references employee(Emp_no) ON DELETE CASCADE;

0 голосов
/ 07 января 2012
CREATE TABLE TABLE_NAME (
    `empid_number`    int     (  11) NOT NULL auto_increment,   
    `employee`        varchar ( 100) NOT NULL               ,
    `manager_number`  int     (  11) NOT NULL               ,
     PRIMARY KEY  (`empid_number`),
     CONSTRAINT `manager_references_employee`
     FOREIGN KEY (`manager_number`) REFERENCES (`empid_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...