【问题标题】:SQL - "No Unique Constraint Matching Given Keys" Despite Presence of Primary KeySQL - 尽管存在主键,但“没有唯一约束匹配给定键”
【发布时间】:2018-04-07 12:53:28
【问题描述】:

我正在开展一个项目,该项目涉及实施学校数据库的简化版本。下面列出了 3 个相关的表格:

create table classes(        --A given class
    class_code varchar(10) primary key
);

create table class_offerings(    --A particular instance of a class
    class_code varchar(10),
    class_name varchar(128) not null,
    semester_code integer,
    maximum_capacity integer check (maximum_capacity >= 0),
    teacher_name varchar(50) not null,    --heavily simplified
    primary key (class_code, semester_code),
    foreign key (class_code) references classes(class_code) 
    on delete cascade on update cascade
);

create table prerequisites(
    prereq varchar(10),
    class_code varchar(10),
    semester_code integer,
    primary key (class_code, semester_code),
    foreign key (class_code) references classes(class_code) 
    on delete cascade on update cascade,
    foreign key (semester_code) references class_offerings(semester_code) 
    on delete cascade on update cascade,
    foreign key (prereq) references classes(class_code) 
    on delete cascade on update cascade
);

当我尝试创建“先决条件”时,我收到消息“错误:没有唯一约束匹配引用表 class_offerings 的给定键。”虽然确实我没有将 UNIQUE 约束应用于 term_code,但它是主键的一部分,据我了解,它强制主键中所有元素的唯一组合。如果我错了,我仍然不想将 UNIQUE 应用于学期代码,因为应该允许相同学期代码的多个条目,只要它们不共享相同的 class_code。如何解决此错误?

【问题讨论】:

    标签: mysql sql database database-design


    【解决方案1】:

    外键也可以由几列组成:

    foreign key (class_code, semester_code) 
         references class_offerings(semester_code,class_code) 
         on delete cascade on update cascade,
    

    但是,就我个人而言,我会避免这样的设计。如果可能的话,我会引入人工 ID 作为始终提供主键的自动增量列。这样外键总是可以在人工 ID 列上。

    自然键很好,也应该作为数据库的约束,我不会在自然键上建立关系。但是,这是我个人的偏好,也有一些观点认为自然键也可以作为主键:https://sqlstudies.com/2016/08/29/natural-vs-artificial-primary-keys/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2015-11-13
      • 2016-04-13
      • 2022-09-27
      相关资源
      最近更新 更多