Sql 设置外键时出现的奇怪问题

Sql 设置外键时出现的奇怪问题,sql,oracle,Sql,Oracle,数据库:os:xp2002上的Oracle 10.1 我在employee表中设置外键,但如果出现错误 此列列表没有匹配的唯一键或主键 我使用以下查询来创建表 部门表: 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)

数据库:os:xp2002上的Oracle 10.1

我在employee表中设置外键,但如果出现错误

此列列表没有匹配的唯一键或主键

我使用以下查询来创建表

部门表:

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))
;
员工表:

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))
;

请提供任何解决方案。

外键必须是另一个表中的主键或唯一键。

将d_名称设为部门表的主键

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

然后创建Employee表。

根据您发布的内容,您在
部门表上似乎没有主键。比如:

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)
...

谢谢。但是在使用oracle 9i时,上面的问题很好。您能解释一下原因吗?@Adnan-您确定旧数据库中的
D_NAME
上至少没有唯一的索引吗?外键可以引用声明为唯一的父项,尽管它实际上应该只引用主键。@Adrian-在9i版本中,是否有一个单独的
alter table
命令在创建部门表后添加PK?@Alex Poole:没有,在创建部门表后没有任何特殊的alter table命令添加PK。@Justin Cave:是的,我确信旧表中的D_名称在laeast没有唯一的索引数据库。谢谢大家。但在使用oracle 9i时,上述问题都很好。有人能解释一下原因吗?在oracle中,从来都不可能创建不引用父表中主键或唯一键的外键,