实验九 数据库完整性实验(V2.0)

实验九   数据库完整性

 

一、实验目的:

1.掌握实体完整性的定义

2.掌握参照完整性的定义,级联(修改、删除)、拒绝和设置为空等定义方法。

3.掌握不能为空、唯一性和check等方式的自定义完整性。

4.掌握触发器的应用。(*)

 

二、实验内容

1、定义两个表

学生表(学号,姓名,性别,年龄,宿舍号)

宿舍表(编号,标准人数,实际人数)

 

2、要求:

      1)学号为主码;姓名唯一,且不能为空;性别为“男”或“女”,年龄为12-30的整数;宿舍号为外码,参照宿舍表的主码(如果修改时,级联修改;如果删除时,拒绝);

      2)编号为主码;标准人数和实际人数都为整数,标准人数默认为6,实际人数默认为0,都不能为空。

      3)未说明数据类型的都为字符型。

 

说明:

     1. check( )的作用是,当进行元组的插入、修改时检查check括号内提供的表达式是否为‘真’。如果不为真,拒绝操作。

     2. 在定义学生表内宿舍号外码时,不仅仅做foreign key (sdom) references dom(dno)定义,还附有  on update cascade on delete no action详细的设置说明,当进行修改时(修改dom表内dno值)做级联修改(级联修改的是student表中,对应的宿舍号),当删除时(删除宿舍表的元组),拒绝删除(原因是,学生表内有学生住在对应的宿舍)。

 3、设计测试数据,并验证。

      1)实体完整性。

      2)参照完整性。被参照不存在的;被参照的修改时,对外码的影响。被参照的删除时,如果有引用,则拒绝删除。

      3)自定义完整性。null,unique,check(  )

 说明:

      insert into dom(dno)
      values('202') 

      insert into student
      values('2012001002','王同学','男',20,'202')

      update dom
      set dno = '201'
      where dno = '202'

          执行以上操作,查看结果。发现先学生表有自动修改。

 

4、触发器的应用。

     1)设计触发器Insert_Trigger,当插入一个学生元组时,如果宿舍号不为空,则对应的宿舍数据实际人数+1,但是不能超过标准人数。

      参考示例代码:

create trigger dom_num2_in_tri
-- 处发器作用对象表
on student

-- 触发器激活条件
for insert as

-- 定义变量
Declare
@dno char(4), -- 宿舍号
@sno char(12),-- 学生号
@dnum1 int,   -- 标准人数
@dnum2 int    -- 已住人数

-- 主程序
begin
  -- 宿舍号
  select @dno=sdom,@sno = sno
  from inserted /*inserted为刚插入的学生元组*/

  if(@dno is not null) 
  begin
    -- 查询标准人数和已住人数
    select @dnum1 = dnum1, @dnum2 = dnum2
    from dom
    where dno = @dno

    if(@dnum1>@dnum2) 
    begin -- 可以安排
       -- 修改宿舍已住人数
       update dom
       set dnum2 = dnum2+1
       where dno = @dno
    end
    else
    begin -- 人数已满,不可以再安排
       delete 
       from student
       where sno = @sno
    end

  end
  
end


      2)设计一个修改或删除学生元组时触发的一个触发器Update_Delete_Trigger,对修改或删除的学生元组对应的宿舍人数进行修改。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库完整性实验实验完整代码 打开ScoreDB数据库完成以下操作: (1)分别定义ScoreDB数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束; (2)往student表插入一条跟已有的学号相同的学生数据验证实体完整性约束; (3)向score表中插入一条数据,其中数据中的课程编号是课程表中没有的,验证参照完整性约束; (4)修改score表中一条数据的课程编号,该编号是课程表中没有的,验证参照完整性约束; (5)删除student表中的一条数据(其中学号出现在score表中),验证参照完整性约束。 (6)增加score表的约束条件,要求成绩在0-100之间。增加student表的约束条件,要求性别只允许取“男”或“女”。 (7)创建一个触发器student_update,实现功能:如果在学生表中修改了学号,则自动修改成绩表中的学号。 (8)创建一个级联删除触发器student_delete。要求:当从学生表中删除某学生信息时,同时删除score表中此学生相关的选课记录。 (9)创建一个触发器student_insert,实现功能:如果往学生表中插入数据,则自动修改班级表中的班级人数classNum。(如果改为删除数据,代码要怎么改?) (10)建立一个触发器course_check,每当删除课程表中记录时,先检查此课程是否已被选修,如选修则不允许删除,且给出提示信息“此课程已有学生选修,无法删除!”。
实验一:创建表、更新表和实施数据完整性 1. 运行给定的SQL Script,建立数据库GlobalToyz。 2. 创建所有表的关系图。 3. 列出所有表中出现的约束(包括Primary key, Foreign key, check constraint, default, unique) 4. 对Recipient表和Country表中的cCountryId属性定义一个用户自定义数据型,并将该属性的型定义为这个自定义数据型。 5. 把价格在$20以上的所有玩具的材料拷贝到称为PremiumToys的新表中。 6. 对表Toys实施下面数据完整性规则:(1)玩具的现有数量应在0到200之间;(2)玩具适宜的最低年龄缺省为1。 7. 不修改已创建的Toys表,利用规则实现以下数据完整性:(1)玩具的价格应大于0;(2)玩具的重量应缺省为1。 8. 给id为‘000001’玩具的价格增加$1。 实验二:查询数据库 1. 显示属于California和Illinoi州的顾客的名、姓和emailID。 2. 显示定单号码、商店ID,定单的总价值,并以定单的总价值的升序排列。 3. 显示在orderDetail表中vMessage为空值的行。 4. 显示玩具名字中有“Racer”字样的所有玩具的材料。 5. 根据2000年的玩具销售总数,显示“Pick of the Month”玩具的前五名玩具的ID。 6. 根据OrderDetail表,显示玩具总价值大于¥50的定单的号码和玩具总价值。 7. 显示一份包含所有装运信息的报表,包括:Order Number, Shipment Date, Actual Delivery Date, Days in Transit. (提示:Days in Transit = Actual Delivery Date – Shipment Date) 8. 显示所有玩具的名称、商标和种(Toy Name, Brand, Category)。 9. 显示玩具的名称和所有玩具的购物车ID。如果玩具不在购物车中,则显示NULL值。 10. 以下列格式显示所有购物者的名字和他们的简称:(Initials, vFirstName, vLastName),例如Angela Smith的Initials为A.S。 11. 显示所有玩具的平均价格,并舍入到整数。 12. 显示所有购买者和收货人的名、姓、地址和所在城市。 13. 显示没有包装的所有玩具的名称。(要求用子查询实现) 14. 显示已发货定单的定单号码以及下定单的时间。(要求用子查询实现) 实验三:视图与触发器 1. 定义一个视图,包括购买者的姓名、所在州和他们所订购玩具的名称、价格和数量。 2. 基于(1)中定义的视图,查询显示所有California州的购买者的姓名和他们所订购玩具的名称及数量。 3. 视图定义如下: CREATE VIEW vwOrderWrapper AS SELECT cOrderNo, cToyId, siQty, vDescription, mWrapperRate FROM OrderDetail JOIN Wrapper ON OrderDetail.cWrapperId = Wrapper.cWrapperId 以下更新命令,在更新siQty和mWrapperRate属性使用了以下更新命令时出现错误: UPDATE vwOrderWrapper SET siQty = 2, mWrapperRate = mWrapperRate + 1 FROM vwOrderWrapper WHERE cOrderNo = ‘000001’ 修改更新命令,以更新基表中的值。 4. 在OrderDetail上定义一个触发器,如果购物者改变了定单的数量,玩具的成本也自动地改变。(提示:Toy cost = Quantity * Toy Rate) 实验四:存储过程 1. 编写一段程序,将每种玩具的价格提高¥0.5,直到玩具的平均价格接近$24.5为止。此外,任何玩具的最大价格不应超过$53。 2. 创建一个称为prcCharges的存储过程,它返回某个定单号的装运费用和包装费用。 3. 创建一个称为prcHandlingCharges的过程,它接收定单号并显示经营费用。PrchandlingCharges过程应使用prcCharges过程来得到装运费和礼品包装费。 提示:经营费用=装运费+礼品包装费 实验五:事务与游标 1. 名为prcGenOrder的存储过程产生存在于数据库中的定单号: CREATE PROCEDURE prcGenOrder @OrderNo char(6) OUTPUT as SELECT @OrderNo=Max(cOrderNo) FROM Orders SELECT @OrderNo= CASE WHEN @OrderNo>=0 and @OrderNo=9 and @OrderNo=99 and @OrderNo=999 and @OrderNo=9999 and @OrderNo=99999 Then Convert(char,@OrderNo+1) END RETURN 当购物者确认定单时,应该出现下面的步骤: (1)用上面的过程产生定单号。 (2)定单号,当前日期,购物车ID,和购物者ID应该加到Orders表中。 (3)定单号,玩具ID,和数量应加到OrderDetail表中。 (4)在OrderDetail表中更新玩具成本。(提示:Toy cost = Quantity * Toy Rate). 将上述步骤定义为一个事务。编写一个过程以购物车ID和购物者ID为参数,实现这个事务。 2. 编写一个程序显示每天的定单状态。如果当天的定单值总合大于170,则显示“High sales”,否则显示”Low sales”.报告中要求列出日期、定单状态和定单总价值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值