PostgreSQL错误:没有唯一约束匹配引用表

时间:2016-06-07 08:02:43

标签: sql postgresql foreign-keys

create table instructor(
instructor_id varchar(15) not null,
instructor_name varchar(15) not null,
dept_name varchar(15) not null,
primary key(instructor_id),
unique(instructor_name));

create table time_slot(
time_slot_id varchar(15) not null,
day varchar(15) not null,
start_time varchar(15) not null,
end_time varchar(15) not null,
primary key(time_slot_id, day, start_time));

create table student(
student_id varchar(15) not null,
user_id varchar(15) not null,
password varchar(15) not null,
num_item int,
primary key(student_id, user_id));


create table section(
course_id varchar(15) not null,
sec_id varchar(15) not null,
semester varchar(15) not null,
year varchar(15) not null,
title varchar(15) not null,
building varchar(15),
room_no varchar(15),
time_slot_id varchar(15),
dept_name varchar(15),
credits varchar(15),
instructor_id varchar(15) not null,
primary key(course_id, sec_id, semester, year),
foreign key(time_slot_id) references time_slot(time_slot_id),
foreign key(instructor_id) references instructor(instructor_id));

create table evaluation(
user_id varchar(15) not null,
sec_id varchar(15) not null,
total_score int not null,
workload int not null,
difficulty int not null,
attendance int not null,
grade int not null,
accomplishment int not null,
comment varchar(200),
primary key(user_id, sec_id),
foreign key(user_id) references student(user_id),
foreign key(sec_id) references section(sec_id));


create table teaches(
instructor_id varchar(15) not null,
course_id varchar(15) not null,
sec_id varchar(15) not null,
semester varchar(15) not null,
year varchar(15) not null,
primary key(instructor_id, course_id, sec_id, semester, year),
foreign key(instructor_id) references instructor(instructor_id),
foreign key(course_id) references section(course_id),
foreign key(sec_id) references section(sec_id),
foreign key(semester) references section(semester),
foreign key(year) references section(year));

我尝试使用带有这些代码的postgresql创建表,但它一直在说没有唯一约束匹配给定表的给定键。当我尝试创建表教导,部分和评估时,会出现此消息。

请帮帮我。

+)我改变了create语句的顺序,并在表教师中添加了唯一键,但仍然无效。

2 个答案:

答案 0 :(得分:1)

那些CREATE DDL命令的顺序不正确,您正在尝试创建尚未存在的引用。

按以下顺序创建表格:

1 - instructor
2 - time_slot
3 - student
4 - section
5 - evaluation
6 - teaches

答案 1 :(得分:0)

基本上,您需要确保外键中的引用具有相应的唯一键或主键。

您的教学表,有参考资料

foreign key(instructor_id) references instructor(instructor_id),

但是instructor_id上没有主键。相反,您在instructor_id和instructor_name上有一个主键。

我怀疑这是一个错误,只要他们的名字不同,这意味着两位教师可以拥有相同的身份。

使用id上的主键替换两个字段上的单个主键,并且教师名称上的唯一键将允许您确保两个字段都是唯一的,同时提供教学表需要链接回的约束指导员。

create table instructor(
instructor_id varchar(15) not null,
instructor_name varchar(15) not null,
dept_name varchar(15) not null,
primary key(instructor_id),
unique(instructor_name));

这也适用于您定义的所有其他主键,这些主键是多列但由具有单个字段的外键引用。

此外,您应该重新排序@sagi

所述的create语句

修改即可。从下面的sagi评论看来,我的答案似乎令人困惑。试着澄清一下。

REFERENCES (col1)的外键要求表上有一个约束条件:

 PRIMARY KEY (col1)
 UNIQUE (col1)

PRIMARY KEY (col1, col2)

不匹配

如果主键肯定应该是两列,这意味着它只能由具有两列的外键引用:REFERENCES (col1, col2)