数据库设计 联合主键设为外键的问题

  很多时候我们在数据库设计中都会遇到这样的问题:

有两个表 ,例如(红色的是主键)

学生(学号,姓名,性别,专业号,班级号)

student(sno,sname,sex,spno,class_no);

专业(专业号,专业名称,上课学时);

department(spno,sname,semester);

班级:(专业号,班级号,班主任);

class(spno,class_no,header);

这个时候,我们想把student表里面的class_no设为外键,references  class表,这个时候应该怎么做呢?

我一开始的做法是:

alter  table student

add constraint  fr_student foreign key(class_no)   references  class(class_no);

会出现什么问题呢?

消息 1776,级别 16,状态 0,第 1 行
在被引用表 'class' 中没有与外键 'fr_student' 中的引用列列表匹配的主键或候选键。
消息 1750,级别 16,状态 0,第 1 行
无法创建约束。请参阅前面的错误消息。

会报错!

为什么呢?

这个时候我们就好好好理解一下定义了!

什么是外码,外码设置有什么条件?

其中有一点很重要的就是:外码必须是另外一个表的主码!

这里,我们的student表中的class_no如果想要设计成为一个外码,我们首先要找一下,它是哪一个表的主码?

class表?

class表中的主码是(spno,class_no);这个才是class的主码,是联合主键!

所以,果你设置联合主键,那么外键必须同时引用两个主键属性,否则只能用check约束来实现参照关系。

所以,一般这个时候你可以回去看看语意有没有理解错误,我的一开始就是因为语意理解错误了,才会出这种情况,我的student表中的(spno,class_no)应该设置成为外键才对。

写的不好的可以告诉我一下,让我修改一下

 

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主键是在数据库表中用来唯一标识每一行数据的字段。主键具有以下特点:一张表中主键是唯一的,主键不能为空。如果一个表中的字段不能作为唯一标识每一行数据时,可以选择多个字段作为联合主键联合主键的特点是,如果去掉联合主键中的某个字段,剩下的字段仍然可以构成联合主键,否则说明之前的联合主键是错误的。\[1\] 外键是子表中对应于主表的列,用来建立表与表之间的关系。外键的值要求与主表的主键或唯一键相对应,用来强制引用完整性。一个表可以有多个外键。例如,在成绩表中,学号可以作为外键,与学生表中的学号关联外键可以有重复的值,也可以是空值。\[2\]\[3\] 在数据库中,主键和外键的声明可以通过在表的字段声明中指定相应的约束来实现。主键约束用于声明主键字段,外键约束用于声明外键字段。通过这样的声明,数据库系统可以确保主键的唯一性和外键的引用完整性。 #### 引用[.reference_title] - *1* *2* [数据库的完整性:主键和外键](https://blog.csdn.net/Peakednes/article/details/106501136)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [数据库的主键与外键](https://blog.csdn.net/YangYanDong666/article/details/89070881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值