PostgreSQL / PGAdmin4错误:没有唯一约束匹配给定引用表的键
这是我试图编码到PGAdmin4 / Postgresql中的'模式':http://i.imgur.com/xPEu8Sh.jpg
我能够转换所有表格,除了“QUALIFICATIONS” .
我试图处理以下查询:
create table REGISTRATION(
StudentID int,
SectionNo int,
Semester varchar(16),
foreign key(StudentID) references Student(StudentID),
foreign key (SectionNo, Semester) references Section(SectionNo, Semester),
primary key(studentID, SectionNo, Semester)
);
我收到以下消息:错误:没有唯一约束匹配给定的引用表“部分”的键
这些是我在表SECTION中的外国和主要
PKEY:i.imgur.com/BcUNKug.jpg
FKEY:i.imgur.com/D8B8hRW.jpg
SECTION代码表:
CREATE TABLE class_scheduling_01.section
(
sectionno integer NOT NULL,
semester character varying(16) COLLATE pg_catalog."default" NOT NULL,
courseid character varying(16) COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT section_pkey PRIMARY KEY (sectionno, semester, courseid),
CONSTRAINT section_sectionno_key UNIQUE (sectionno),
CONSTRAINT section_courseid_fkey FOREIGN KEY (courseid)
REFERENCES class_scheduling_01.course (courseid) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
我还运行了命令:ALTER TABLE部分ADD UNIQUE(sectionno);
因为没有任何属性似乎在重复 .
尽管我得到了所有这些:错误:没有唯一约束匹配给定的引用表“section”查询键在642毫秒内成功返回 .
编辑:我已经回到COURSE表并使courseID成为一个独特的约束 . 我仍然得到同样的信息 . SECTION表有一个由3列组成的复合主键 . 如链接的第一张图片中所示,在所有值中,只有SECTION.sectionno是唯一具有唯一/非重复值的列 .
第二次编辑:我决定一步一步创建表“REGISTRATION”,并使用alter table命令使外键最后 .
我能够将列Student2和SectionNo外键设置为各自的列 . 当我试图使REGISTRATION.semester成为SECTION.semester的外键时,我再次收到错误消息 . alter table REGISTRATION添加外键(学期)参考部分(学期);
如图所示,我链接了学期 Value ,重复;尽管如此,我还需要让它独一无二吗?或者我是否创建一个唯一的命令将所有3列(SECTION)一起分配为唯一,而不仅仅是1?如果是这样,怎么样?
1 回答
这个
要求对SectionNo和Semester这对列有唯一约束 .
这种改变应该让这些SQL语句成功 . 我没有检查是否这是一个好主意 .
我明白你的意思,但这是一个不好的思考方式 .
PostgreSQL将不带引号的标识符折叠为小写 . 所以PostgreSQL会将标识符
SQL
,Sql
和sql
视为sql
. 带引号或分隔的标识符,如"Select"
,总是指表或列;它's never interpreted as a keyword. Quoted identifiers are case-sensitive. You can' t成功将表"Select"
称为select
.