【问题标题】:SQL primary key and foreign keySQL主键和外键
【发布时间】:2020-07-07 20:22:47
【问题描述】:

一个关系的主键可以作为外键出现在另一个关系上,但在不同的属性名称中?如果是这样,当我们提供关系模式时,是否可以提供任何一个属性名称或者是否有不同的方法?

例如:例如,员工关系有一个主键 SID(学生 ID),而在一个单独的关系(例如,课程)中,有一个名为“学生”的属性,但包含与 SID 完全相同的组件。我们如何为这种场景编写关系模式?

【问题讨论】:

    标签: sql oracle database-design schema


    【解决方案1】:

    据我理解的问题,您第一句话的答案是“是的,它可以”。您如何称呼列并不重要(我想这就是您的文本中的“属性”);它们应该在数据类型和 - 如果复合 - 列数(属性)上匹配。

    例如(这是Oracle;您使用哪个数据库?):t_student 是一个 表,它在student_id 列上设置了主键:

    SQL> create table t_student
      2    (student_id number       constraint pk_stu primary key,
      3     name       varchar2(30),
      4     birthdate  date
      5    );
    
    Table created.
    

    t_course 是一个 child 表。其sid 列引用t_student.student_id 列;它们的名称不匹配(这是您所要求的),但是 - 它们的数据类型也不匹配:

    SQL> create table t_course
      2    (course_id  number       constraint pk_cou primary key,
      3     sid        varchar2(10) constraint fk_coustu references t_student(student_id),
      4     name       varchar2(20)
      5    );
       sid        varchar2(10) constraint fk_coustu references t_student(student_id),
       *
    ERROR at line 3:
    ORA-02267: column type incompatible with referenced column type
    

    如您所见,它失败了。但是,如果更改数据类型以匹配父表的主键列的数据类型,则一切正常:

    SQL> create table t_course
      2    (course_id  number       constraint pk_cou primary key,
      3     sid        number       constraint fk_coustu references t_student(student_id),
      4     name       varchar2(20)
      5    );
    
    Table created.
    
    SQL>
    

    【讨论】:

    • @littefoot 你搞定了,基本上属性的名称不相关但数据类型需要匹配。
    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 2011-09-28
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2023-03-14
    相关资源
    最近更新 更多