• SQL Server多个主键与外键、复合主键与外键引用


    一、SQL查表语句执行机制

    1、逻辑执行顺序:从上到下,先有后走

    2、否则报错:"对象名无效"、"外键 'FK__学生表__6CD828CA' 引用了无效的表 '宿舍表'"

    CREATE TABLE 学生表(
      学号 char(8) primary key,
      楼号 char(2) not null,
      foreign key(楼号) references 宿舍表(楼号),
    );
    CREATE TABLE 宿舍表(
      楼号 char(2) not null,
      primary key(楼号),
    );
    

    3、解决方法:调整建表顺序(先有主键,才可引用外键)

    CREATE TABLE 宿舍表(
      楼号 char(2) not null,
      primary key(楼号),
    );
    CREATE TABLE 学生表(
      学号 char(8) primary key,
      楼号 char(2) not null,
      foreign key(楼号) references 宿舍表(楼号),
    );
    

    二、1:1多个单一外键引用不同表单一主键

    (1)例题:

    Create table 图书表(
      书号 nchar(6) primary key,
    )
    Create table 书店表(
      书店编号 nchar(6) primary key,
    )
    Create table 图书销售表(
      书号 nchar(6) not null,
      书店编号 nchar(6) not null,
      销售日期 smalldatetime not null,
      primary key(书号,书店编号,销售日期),
      foreign key(书号) references 图书表(书号),
      foreign key(书店编号) references 书店表(书店编号)
    )
    

    (2)删表:得先删有引用外键约束的表

    三、n:m复合外键引用同一表复合主键

    (1)1:n不符合语法逻辑,报错:在被引用表 '宿舍表' 中没有与外键 'FK__学生表__楼号__793DFFAF' 中的引用列列表匹配的主键或候选键。

    CREATE TABLE 宿舍表(
      楼号 char(2) not null,
      宿舍号 char(3) not null,
      primary key(楼号,宿舍号),
    );
    CREATE TABLE 学生表(
      学号 char(8) primary key,
      楼号 char(2) not null,
      宿舍号 char(3) not null,
      foreign key(楼号) references 宿舍表(楼号),
      foreign key(宿舍号) references 宿舍表(宿舍号),
    );
    

    (2)解决方法:同一表复合外键对应引用同一表复合主键

    CREATE TABLE 宿舍表(
      楼号 char(2) not null,
      宿舍号 char(3) not null,
      primary key(楼号,宿舍号),
    );
    CREATE TABLE 学生表(
      学号 char(8) primary key,
      楼号 char(2) not null,
      宿舍号 char(3) not null,
      foreign key(楼号,宿舍号) references 宿舍表(楼号,宿舍号),
    


    作者:MaricoCheung
    出处:http://www.cnblogs.com/MaricoCheung/
    ——有心人做有心事哦,晚安EmilyChen!

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    WPF、UWP以及其他类型项目的csproj文件的迁移(SDK-Style)
    文书生成笔录预设保存按钮Mq中间转传服务
    卷宗添加争议焦点数据制造脚本(卷宗部分)
    案件信息同步之后,文书系统案件名称显示不正确问题
    DISTINCT----mysql移除返回的重复值
    Nginx系列教程(6)Nginx location 匹配规则详细解说
    转载 chrony 详解
    dmesg 时间转换
    axios---get和post用法详解
    通过递归来封装sessionStorage---set/get/delete
  • 原文地址:https://www.cnblogs.com/MaricoCheung/p/13868239.html
Copyright © 2020-2023  润新知