• 数据库原理及应用实验报告-实验8-参照完整性


    数据库原理及应用实验报告

     实验题目  实验8参照完整性  

      1. 实验目的

    学习建立外键,以及利用FOREIGN KEY…REFERENCES子句以及各种约束保证参照完整性。

      1. 实验内容
      1. 为演示参照完整性,建立表Course,令xn_Cno为其主键,并在xun_Stu_Union表中插入数据。为下面的实验步骤做预先准备。
      2. 建立表xun_SC,令xn_Sno和xn_Cno分别为参照xun_Stu_Union表以及Course表的外键,设定为级联删除,并令(xn_Sno,xn_Cno)为其主键。在不违反参照完整性的前提下,插入数据。
      3. 演示违反参照完整性的插入数据。
      4. 在xun_Stu_Union中删除数据,演示级联删除。
      5. 在Course中删除数据,演示级联删除。
      6. 为了演示多重级联删除,建立xun_Stu_Card表,令xn_Sno为参数xun_Students表的外键,令xn_Card_id为其主键,并插入数据。
      7. 为了演示多重级联删除,建立xun_ICBC_Card表,令xn_Stu_card_id为参数xun_Stu_Union表的外键,令xn_Card_id为其主键,并插入数据。
      8. 通过删除xun_Students表中的一条记录,演示三个表的多重级联删除。
      9. 演示事务中进行多重级联删除失败的处理。修改xun_ICBC_Card表的外键属性,使其变为On delete No action,演示事务中通过删除xun_Students表中的一条记录,多重级联删除失败,整个事务回滚到事务的初始状态。
      10. 演示互参考问题及其解决方法。要建立教师授课和课程指定教师听课关系的两张表,规定一个教师可以授多门课,但是每个课程只能指定一个教师去听课,所以要为两张表建立相互之间的参照关系。

    做 “实验8参照完整性”的准备工作


    1、建立xun_Stu_Union

    1. CREATE TABLE xun_Stu_Union
    2. (xn_Sno CHAR(8) not null primary key,
    3. xn_Sname CHAR(8),
    4. xn_Ssex CHAR(1),
    5. xn_Sage INT,
    6. xn_Sdept CHAR(20))


    2、插入相应数据,结果如图1

     图1

    1. insert into xun_Stu_Union
    2. values('S02','王兵','M','23','CS')
    3. insert into xun_Stu_Union
    4. values('S03','黄浩','F','25','EE')
    5. insert into xun_Stu_Union
    6. values('S05','黄浩','F','25','EE')
    7. insert into xun_Stu_Union
    8. values('S09','李永','M','25','EE')
      1. 实验步骤

    以系统管理员登录到SSMS,在新建查询窗口中输入如下命令,运行并观察和记录结果。

        1. 在新建查询窗口中输入如下SQL语句:

    Xuni_ University_Mis:

    建立表Course,令xn_Cno为其主键,在xun_Stu_Union Values和Course插入数据:

    1. INSERT xun_Stu_Union Values(‘S01’,‘李用’,‘0’,24,‘FF’)
    2. SELECT * FROM xun_Stu_Union;
    3. CREATE TABLE Course(
    4. xn_Cno CHAR(4) NOT NULL UNIQUE,
    5. xn_Cname VARCHAR(50) NOT NULL,
    6. xn_Cpoints INT,
    7. CONSTRAINT PK PRIMARY KEY(xn_Cno));
    8. INSERT Course VALUES(‘C01’,’ComputerNetworks’,2);
    9. INSERT Course VALUES(‘C02’,’ArtificialIntelligence’,3);

        1. 在新建查询窗口中输入如下SQL语句:
    1. Xuni_University_Mis:
    2. CREATE TABLE xun_SC
    3. (xn_Sno CHAR(8) ,
    4. xn_Cno CHAR(8) ,
    5. Scredit INT,
    6. CONSTRAINT PK_SC PRIMARY KEY(xn_Sno,xn_Cno),
    7. CONSTRAINT FK_SC_Sno FOREIGN KEY(xn_Sno) REFERENCES xun_Stu_Union (xn_Sno) ON DELETE CASCADE,
    8. CONSTRAINT FK_SC_Cno FOREIGN KEY(xn_Cno) REFERENCES Course(xn_Cno) ON DELETE CASCADE
    9. );
    10. INSERT INTO xun_SC VALUES('S02','C01',2);
    11. INSERT INTO xun_SC VALUES ('S02','C02',2);
    12. INSERT INTO xun_SC VALUES ('S01','C01',2);
    13. INSERT INTO xun_SC VALUES ('S01','C02',2);
    14. SELECT * FROM xun_SC;
        1. 在新建查询窗口中输入如下SQL语句:

    Xuni_University_Mis:

    演示违反参照完整性的插入数据:

    1. insert into xun_SC
    2. values('S99','C99',2)

    报错:

    消息 547,级别 16,状态 0,第 1 行

    INSERT 语句与 FOREIGN KEY 约束"FK_SC_Sno"冲突。该冲突发生于数据库"Xuni_University_Mis",

    表"dbo.xun_Stu_Union", column 'xn_Sno'。

    语句已终止。

    结果图2所示:


    图2INSERT 失败

     

    因为违反了参照完整性,因为xun_Stu_Union没有xn_Sno为S99的元组,而xun_Stu_Union的xn_Sno是xun_SC 的外键,所以这样插入违反了参照完整性,不可行。

        1. 在新建查询窗口中输入如下SQL语句:

    Xuni_University_Mis:

    xun_Stu_Union表中删除数据,演示级联删除

    1. DELETE FROM xun_Stu_Union WHERE xn_Sno='S01'
    2. SELECT * FROM xun_SC;

    结果图3,可知xun_SC表中xn_Sno='S01'的元组也被删除。

     

    3删除S01

        1. 在新建查询窗口中输入如下SQL语句:

    Xuni_University_Mis:

    在Course表中删除数据,演示级联删除。

    1. DELETE FROM Courses WHERE xn_Cno='C02'
    2. SELECT * FROM xun_SC;

    结果如图4,可知xun_SCxn_Cno='C02'的元组也被删除:

      图4删除C02

        1. 新建查询窗口中输入如下SQL语句:

    Xuni_University_Mis:

    建立表xun_Stu_Card,令xn_Card_id为主键,并插入数据,令xn_Sno作为xun_Students表的外键。

    1. CREATE TABLE xun_Stu_Card(
    2. xn_Card_id CHAR(14),
    3. xn_Sno CHAR(8),
    4. Remained_money DECIMAL(10,2),
    5. Constraint PK_Stu_Card PRIMARY KEY(xn_Card_id),
    6. Constraint FK_Stu_Card_Sno FOREIGN KEY(xn_Sno) REFERENCES xun_Students(xn_Sno) ON DELETE CASCADE
    7. )
    8. INSERT INTO xun_Stu_Card VALUES('05212567','S03',400.25);
    9. INSERT INTO xun_Stu_Card VALUES('05212222','S23',600.50);
    10. SELECT * FROM xun_Stu_card;

    因为xun_Students表中不存在xn_Sno=S09的元组,插入会失败,所以改成了S23

        1. 新建查询窗口中输入如下SQL语句:

    Xuni_University_Mis

    建立表xun_ICBC_Cardxn_Stu_card_id 作为主键,xn_Stu_card_id为xun_Stu_card的外键。

    1. CREATE TABLE xun_ICBC_Card(
    2. xn_Bank_id CHAR(20),
    3. xn_Stu_card_id CHAR(14),
    4. xn_Restored_money DECIMAL(10,2),
    5. constraint PK_ICBC_Card PRIMARY KEY(xn_Bank_id),
    6. constraint FK_ICBC_Card_Stu_id FOREIGN KEY(xn_Stu_card_id) REFERENCES xun_Stu_card(xn_card_id) ON DELETE CASCADE
    7. )
    8. INSERT INTO xun_ICBC_Card VALUES('9558844022312','05212567',15000.1);
    9. INSERT INTO xun_ICBC_Card VALUES('9558844023645','05212222',50000.3);
    10. SELECT * FROM xun_ICBC_Card;
        1. 在新建查询窗口中输入如下SQL语句:

    Xuni_ University_Mis:

    删除 xun_Students 的记录,演示三个表的多重级联删除。

    1. ALTER TABLE xun_Reports DROP [students_report];
    2. ALTER TABLE xun_Reports ADD
    3. CONSTRAINT [FK_Reports_Students] FOREIGN KEY
    4. (
    5. [xn_Sno]
    6. ) REFERENCES [dbo].[xun_Students] (
    7. [xn_Sno]
    8. ) ON DELETE CASCADE;
    9. DELETE FROM xun_Students WHERE xn_Sno='S03';
    10. SELECT * FROM xun_Stu_card;
    11. SELECT * FROM xun_ICBC_Card;

    结果如下图,可知xun_Stu_Card 表中 xn_Sno='S03'的记录已被删除(该记录为05212567','S03',400.25),也可知xun_ICBC_Card表中xn_Card_id =05212567的记录也被删除(该记录为'9558844022312','05212567',15000.1):

     

    图5删除S03

    (9)在新建查询窗口中输入如下SQL语句:

    演示事务中多重级联删除失败的处理,修改xun_ICBC_Card表的外键属性,变为 ON DELETE NO ACTION。

    1. ALTER TABLE xun_ICBC_Card
    2. DROP CONSTRAINT FK_ICBC_Card_Stu_id;
    3. ALTER TABLE xun_ICBC_Card
    4. ADD CONSTRAINT FK_ICBC_Card_Stu_id FOREIGN KEY (xn_Stu_card_id)
    5. REFERENCES xun_Stu_card(xn_Card_id) ON DELETE NO ACTION;

    在新建查询窗口中输入如下SQL语句:

    1. Begin Transaction Del
    2. DELETE FROM xun_Stu_Card WHERE xn_Card_id ='05212222';
    3. SELECT * FROM xun_Stu_card;
    4. SELECT * FROM xun_ICBC_card;
    5. Commit Transaction Del

    结果如图6,可知两个表中的记录都删除失败,该条记录依然存在。

    图6  05212222

     

    错误消息弹出:

    消息 547,级别 16,状态 0,第 2 行

    DELETE 语句与 REFERENCE 约束"FK_ICBC_Card_Stu_id"冲突。该冲突发生于数据库"Xuni_University_Mis",表"dbo.xun_ICBC_Card", column 'xn_Stu_card_id'。

    语句已终止。

    在新建查询窗口中输入如下SQL语句:

    1. Xuni_University_Mis
    2. SELECT * FROM Stu_card;
    3. SELECT * FROM ICBC_card;

    结果如图7:

     图7

        1. 在新建查询窗口中输入如下SQL语句:

    演示互参考问题及其解决方案,建立xun_Listen_course表和xun_Teach_course

    表。

    1. CREATE TABLE xun_Listen_course(
    2. xn_Tno CHAR(6),xn_Tname VARCHAR(20),xn_Cno CHAR(4)
    3. CONSTRAINT PK_listen_course PRIMARY KEY(xn_Tno)
    4. CONSTRAINT FK_listen_course FOREIGN KEY(xn_Cno)
    5. REFERENCES xun_Teach_course(xn_Cno)
    6. )
    7. CREATE TABLE xun_Teach_course(
    8. xn_Cno CHAR(4),xn_Cname VARCHAR(30),xn_Tno CHAR(6)
    9. CONSTRAINT PK_Teach_course PRIMARY KEY(xn_Cno)
    10. CONSTRAINT FK_Teach_course FOREIGN KEY(xn_Tno)
    11. REFERENCES xun_Listen_course(xn_Tno)
    12. )

    报错:

    消息 1767,级别 16,状态 0,第 1 行

    外键 'FK_listen_course' 引用了无效的表 'xun_Teach_course'。

    消息 1750,级别 16,状态 0,第 1 行

    无法创建约束或索引。请参阅前面的错误。

    实验结果如图8:

     

    图8

    (11) 在新建查询窗口中输入如下SQL语句:

    Xuni_University_Mis

    建立表 xun_Listen_course,xn_Tno来自PK_listen_Course的外键

    1. CREATE TABLE xun_Listen_course(
    2. xn_Tno CHAR(6),xn_Tname VARCHAR(20),xn_Cno CHAR(4)
    3. CONSTRAINT PK_listen_Course PRIMARY KEY(xn_Tno)
    4. )

    成功

    (12) 在新建查询窗口中输入如下SQL语句:

    Xuni_ University_Mis

    1. CREATE TABLE xun_Teach_course(
    2. xn_Cno CHAR(4),xn_Cname VARCHAR(30),xn_Tno CHAR(6)
    3. CONSTRAINT PK_teach_course PRIMARY KEY(xn_Cno)
    4. CONSTRAINT FK_teach_course FOREIGN KEY(xn_Tno)
    5. REFERENCES xun_Listen_course(xn_Tno)
    6. )
    7. ALTER TABLE xun_Listen_course
    8. ADD CONSTRAINT FK_listen_course FOREIGN KEY(xn_Cno)
    9. REFERENCES xun_Teach_course(xn_Cno);

    成功,如图9:

     

    图9

      1. 实验要求

    (1) 实验之前请细细阅读实验总体要求与说明指导书

    (2 ) 在SQL Server 2005或2008或2014的SSMS环境中,完成以上实验(1)-(10)步所有SQL数据定义操作,并将其中粗体步骤的操作窗口剪贴到实验报告中。

    8.5实验体会

    1)实验反思

      无

    2)实验收获

    学习力参照完整性的相关内容,加深了对于这部分知识点的认识

    附录:

    1. 准备工作
    2. CREATE TABLE xun_Stu_Union
    3. (xn_Sno CHAR(8) not null primary key,
    4. xn_Sname CHAR(8),
    5. xn_Ssex CHAR(1),
    6. xn_Sage INT,
    7. xn_Sdept CHAR(20))
    8. insert into xun_Stu_Union
    9. values('S02','王兵','M','23','CS')
    10. insert into xun_Stu_Union
    11. values('S03','黄浩','F','25','EE')
    12. insert into xun_Stu_Union
    13. values('S05','黄浩','F','25','EE')
    14. insert into xun_Stu_Union
    15. values('S09','李永','M','25','EE')
    16. 1.
    17. INSERT xun_Stu_Union Values(‘S01’,‘李用’,‘0’,24,‘FF’)
    18. SELECT * FROM xun_Stu_Union;
    19. CREATE TABLE Course(
    20. xn_Cno CHAR(4) NOT NULL UNIQUE,
    21. xn_Cname VARCHAR(50) NOT NULL,
    22. xn_Cpoints INT,
    23. CONSTRAINT PK PRIMARY KEY(xn_Cno));
    24. INSERT Course VALUES(‘C01’,’ComputerNetworks’,2);
    25. INSERT Course VALUES(‘C02’,’ArtificialIntelligence’,3);
    26. 2.
    27. CREATE TABLE xun_SC
    28. (xn_Sno CHAR(8) ,
    29. xn_Cno CHAR(8) ,
    30. Scredit INT,
    31. CONSTRAINT PK_SC PRIMARY KEY(xn_Sno,xn_Cno),
    32. CONSTRAINT FK_SC_Sno FOREIGN KEY(xn_Sno) REFERENCES xun_Stu_Union (xn_Sno) ON DELETE CASCADE,
    33. CONSTRAINT FK_SC_Cno FOREIGN KEY(xn_Cno) REFERENCES Course(xn_Cno) ON DELETE CASCADE
    34. );
    35. INSERT INTO xun_SC VALUES('S02','C01',2);
    36. INSERT INTO xun_SC VALUES ('S02','C02',2);
    37. INSERT INTO xun_SC VALUES ('S01','C01',2);
    38. INSERT INTO xun_SC VALUES ('S01','C02',2);
    39. SELECT * FROM xun_SC;
    40. 3.
    41. insert into xun_SC
    42. values('S99','C99',2)
    43. 消息 547,级别 16,状态 0,第 1
    44. INSERT 语句与 FOREIGN KEY 约束"FK_SC_Sno"冲突。该冲突发生于数据库"Xuni_University_Mis",
    45. 表"dbo.xun_Stu_Union", column 'xn_Sno'
    46. 语句已终止。
    47. 4.
    48. DELETE FROM xun_Stu_Union WHERE xn_Sno='S01'
    49. SELECT * FROM xun_SC;
    50. 5.
    51. DELETE FROM Courses WHERE xn_Cno='C02'
    52. SELECT * FROM xun_SC;
    53. 6.
    54. CREATE TABLE xun_Stu_Card(
    55. xn_Card_id CHAR(14),
    56. xn_Sno CHAR(8),
    57. Remained_money DECIMAL(10,2),
    58. Constraint PK_Stu_Card PRIMARY KEY(xn_Card_id),
    59. Constraint FK_Stu_Card_Sno FOREIGN KEY(xn_Sno) REFERENCES xun_Students(xn_Sno) ON DELETE CASCADE
    60. )
    61. INSERT INTO xun_Stu_Card VALUES('05212567','S03',400.25);
    62. INSERT INTO xun_Stu_Card VALUES('05212222','S23',600.50);
    63. SELECT * FROM xun_Stu_card;
    64. 7.
    65. CREATE TABLE xun_ICBC_Card(
    66. xn_Bank_id CHAR(20),
    67. xn_Stu_card_id CHAR(14),
    68. xn_Restored_money DECIMAL(10,2),
    69. constraint PK_ICBC_Card PRIMARY KEY(xn_Bank_id),
    70. constraint FK_ICBC_Card_Stu_id FOREIGN KEY(xn_Stu_card_id) REFERENCES xun_Stu_card(xn_card_id) ON DELETE CASCADE
    71. )
    72. INSERT INTO xun_ICBC_Card VALUES('9558844022312','05212567',15000.1);
    73. INSERT INTO xun_ICBC_Card VALUES('9558844023645','05212222',50000.3);
    74. SELECT * FROM xun_ICBC_Card;
    75. 8.
    76. ALTER TABLE xun_Reports DROP [students_report];
    77. ALTER TABLE xun_Reports ADD
    78. CONSTRAINT [FK_Reports_Students] FOREIGN KEY
    79. (
    80. [xn_Sno]
    81. ) REFERENCES [dbo].[xun_Students] (
    82. [xn_Sno]
    83. ) ON DELETE CASCADE;
    84. DELETE FROM xun_Students WHERE xn_Sno='S03';
    85. SELECT * FROM xun_Stu_card;
    86. SELECT * FROM xun_ICBC_Card;
    87. 9.1
    88. ALTER TABLE xun_ICBC_Card
    89. DROP CONSTRAINT FK_ICBC_Card_Stu_id;
    90. ALTER TABLE xun_ICBC_Card
    91. ADD CONSTRAINT FK_ICBC_Card_Stu_id FOREIGN KEY (xn_Stu_card_id)
    92. REFERENCES xun_Stu_card(xn_Card_id) ON DELETE NO ACTION;
    93. 9.2
    94. Begin Transaction Del
    95. DELETE FROM xun_Stu_Card WHERE xn_Card_id ='05212222';
    96. SELECT * FROM xun_Stu_card;
    97. SELECT * FROM xun_ICBC_card;
    98. Commit Transaction Del
    99. 消息 547,级别 16,状态 0,第 2
    100. DELETE 语句与 REFERENCE 约束"FK_ICBC_Card_Stu_id"冲突。该冲突发生于数据库"Xuni_University_Mis",表"dbo.xun_ICBC_Card", column 'xn_Stu_card_id'
    101. 语句已终止。
    102. (1 行受影响)
    103. (1 行受影响)
    104. SELECT * FROM xun_Stu_card;
    105. SELECT * FROM xun_ICBC_card;
    106. 10.
    107. CREATE TABLE xun_Listen_course(
    108. xn_Tno CHAR(6),xn_Tname VARCHAR(20),xn_Cno CHAR(4)
    109. CONSTRAINT PK_listen_course PRIMARY KEY(xn_Tno)
    110. CONSTRAINT FK_listen_course FOREIGN KEY(xn_Cno)
    111. REFERENCES xun_Teach_course(xn_Cno)
    112. )
    113. CREATE TABLE xun_Teach_course(
    114. xn_Cno CHAR(4),xn_Cname VARCHAR(30),xn_Tno CHAR(6)
    115. CONSTRAINT PK_Teach_course PRIMARY KEY(xn_Cno)
    116. CONSTRAINT FK_Teach_course FOREIGN KEY(xn_Tno)
    117. REFERENCES xun_Listen_course(xn_Tno)
    118. )
    119. 报错::
    120. 消息 1767,级别 16,状态 0,第 1
    121. 外键 'FK_listen_course' 引用了无效的表 'xun_Teach_course'
    122. 消息 1750,级别 16,状态 0,第 1
    123. 无法创建约束或索引。请参阅前面的错误。
    124. 11.
    125. CREATE TABLE xun_Listen_course(
    126. xn_Tno CHAR(6),xn_Tname VARCHAR(20),xn_Cno CHAR(4)
    127. CONSTRAINT PK_listen_Course PRIMARY KEY(xn_Tno)
    128. )
    129. 成功
    130. 12.
    131. CREATE TABLE xun_Teach_course(
    132. xn_Cno CHAR(4),xn_Cname VARCHAR(30),xn_Tno CHAR(6)
    133. CONSTRAINT PK_teach_course PRIMARY KEY(xn_Cno)
    134. CONSTRAINT FK_teach_course FOREIGN KEY(xn_Tno)
    135. REFERENCES xun_Listen_course(xn_Tno)
    136. )
    137. ALTER TABLE xun_Listen_course
    138. ADD CONSTRAINT FK_listen_course FOREIGN KEY(xn_Cno)
    139. REFERENCES xun_Teach_course(xn_Cno);、
    140. 成功

  • 相关阅读:
    flutter百度地图定位, poi检索功能
    C++11
    LabVIEW什么时候需要使用DLL封装 Calling External APIs
    【算法|动态规划No.9】leetcodeLCR 091. 粉刷房子
    人工智能基础_机器学习040_Sigmoid函数详解_单位阶跃函数与对数几率函数_伯努利分布---人工智能工作笔记0080
    Spring三级缓存解决循环依赖
    Android学习笔记 17. RecyclerView
    P1966 [NOIP2013 提高组] 火柴排队
    工业相机常见的工作模式、触发方式
    从零开始写 Docker(一)---实现 mydocker run 命令
  • 原文地址:https://blog.csdn.net/cangzhexingxing/article/details/125563268