2011-06-28 4 views
3

базы данных: Oracle 10.1 на ОС: xp2002Странные проблемы во время настройки внешнего ключа

Я устанавливаю внешнего ключа в таблице сотрудников, но я получаю сообщение об ошибке

не соответствующий уникальный или первичный ключ для этого столбца -list

Я использую следующие запросы для создания таблиц.

Отдел стол:

create table department(
d_name varchar2(10) not null, 
d_no_of_employees number(4)); 

Сотрудник таблице:

create table employee(
e_id  number(4)  , 
e_name  varchar2(30)  not null, 
e_f_name varchar2(30)  not null, 
e_desg  varchar2(20)  not null, 
e_address varchar2(50)  not null, 
e_phone_no number(12)  not null, 
e_salary number(10)  not null, 
e_house_rent number(6) not null, 
e_conv_allow number(6) not null, 
e_email  varchar2(50)  not null unique, 
d2_name  varchar2(10)  not null,  
e_hire_month number(2) not null, 
e_hire_year number(4) not null, 
constraint e_id_pk primary key(e_id), 
constraint d2_name_fk foreign key(d2_name) references department(d_name)) 
; 

Любое решение пожалуйста.

+0

благодаря всем you.But при работе с Oracle 9i над quries работали fine.could кто-нибудь пожалуйста объяснить его причину? – Adnan

+3

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

ответ

5

внешний ключ должен быть основным или уникальным ключом в другой таблице.

+0

спасибо. Но во время работы с oracle 9i над quries работала нормально. Не могли бы вы объяснить его причину? – Adnan

+1

@Adnan - Вы уверены, что в старой базе данных не было хотя бы уникального индекса на 'D_NAME'? Внешний ключ может ссылаться на родителя, который объявлен как уникальный, хотя он должен действительно ссылаться только на первичные ключи. –

+1

@Adrian. В версии 9i появилась отдельная команда 'alter table', которая добавила PK после создания таблицы' department'? –

2

Сделайте d_name ПЕРВИЧНЫЙ КЛЮЧ раздела Департамента.

create table department(
d_name varchar2(10) not null, 
d_no_of_employees number(4), 
constraint d_name_pk primary key(d_name)); 

А затем создайте стол сотрудника.

2

От того, что вы опубликовали, у вас нет первичного ключа на столе department. Что-то вроде:

create table department(
d_name varchar2(10) not null, 
d_no_of_employees number(4) 
constraint department_pk primary key(d_name)); 

Или после создания:

alter table department 
add constraint department_pk primary key(d_name) 
... 
Смежные вопросы