zoukankan      html  css  js  c++  java
  • SQL 中联合主键设为外键的问题

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

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

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

    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)应该设置成为外键才对。

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

    
    

  • 相关阅读:
    面向对象第6课——多态——接口
    面向对象第6课——多态——抽象
    面向对象第5课——转型
    面向对象第5课——继承
    bank
    0923异常——练习题目作业
    0923接口——练习题作业
    0922继承,练习题目-作业
    RecyclerView三列展示及单列展示
    bitmap转换为drawable
  • 原文地址:https://www.cnblogs.com/qq84435/p/3664855.html
Copyright © 2011-2022 走看看