首页 文章

PostgreSQL / PGAdmin4错误:没有唯一约束匹配给定引用表的键

提问于
浏览
1

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 回答

  • 1

    这个

    foreign key (SectionNo, Semester) references Section(SectionNo, Semester),
    

    要求对SectionNo和Semester这对列有唯一约束 .

    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,
    -- Unique constraint on the pair
    CONSTRAINT your_constraint_name UNIQUE (SectionNo, Semester)
    );
    

    这种改变应该让这些SQL语句成功 . 我没有检查是否这是一个好主意 .

    SQL不区分大小写 .

    我明白你的意思,但这是一个不好的思考方式 .

    PostgreSQL将不带引号的标识符折叠为小写 . 所以PostgreSQL会将标识符 SQLSqlsql 视为 sql . 带引号或分隔的标识符,如 "Select" ,总是指表或列;它's never interpreted as a keyword. Quoted identifiers are case-sensitive. You can' t成功将表 "Select" 称为 select .

相关问题