【发布时间】:2020-07-07 20:22:47
【问题描述】:
一个关系的主键可以作为外键出现在另一个关系上,但在不同的属性名称中?如果是这样,当我们提供关系模式时,是否可以提供任何一个属性名称或者是否有不同的方法?
例如:例如,员工关系有一个主键 SID(学生 ID),而在一个单独的关系(例如,课程)中,有一个名为“学生”的属性,但包含与 SID 完全相同的组件。我们如何为这种场景编写关系模式?
【问题讨论】:
标签: sql oracle database-design schema
一个关系的主键可以作为外键出现在另一个关系上,但在不同的属性名称中?如果是这样,当我们提供关系模式时,是否可以提供任何一个属性名称或者是否有不同的方法?
例如:例如,员工关系有一个主键 SID(学生 ID),而在一个单独的关系(例如,课程)中,有一个名为“学生”的属性,但包含与 SID 完全相同的组件。我们如何为这种场景编写关系模式?
【问题讨论】:
标签: sql oracle database-design schema
据我理解的问题,您第一句话的答案是“是的,它可以”。您如何称呼列并不重要(我想这就是您的文本中的“属性”);它们应该在数据类型和 - 如果复合 - 列数(属性)上匹配。
例如(这是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>
【讨论】: