2012-01-07 1 views
9

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

сотрудников:

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

ответ

-2
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 

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

+0

несколько ...! Любые другие методы/предложения для оракула? –

+0

Я никогда не пробовал, но я думаю, что работа с TABLE_NAME вместо «parent_table_name» должна работать! – instanceOfObject

+3

Это недействительный оператор для Oracle –

20

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

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

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

, который может быть решением, НО в моем случае нет «триггеров», «разрешений» не разрешено. просто «создать таблицу», за которой следуют «вставки», нужны только. Теперь? –

+0

@popstack, у меня было слишком много, чтобы сказать, поэтому я добавил отредактировать ответ. – Ben

+0

Удостоверьтесь, что вам нужно будет определить ограничение уникального или внешнего ключа для ограничения внешнего ключа. И вы всегда можете опустить предложение ON ON DELETE, которое функционирует так же, как и условие ON ON DELETE RESTRICT в других СУБД, предотвращая удаление родителя с дочерними записями. –

1

SELF ССЫЛКИ QUERY ...

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;