• 数据库实验7 完整性约束


    触发器文章:

    实验题目(1)
    1 数据完整性。以实验数据库为基础数据,请使用T-SQL语句完成以下内容,并将SQL语句写在实验报告册中:

    实验代码、实验过程(界面方式下的抓图)、实验结果(抓图) 1)将数据库stu的表course的cno字段定义为主键,约束名称为cno_pk;

    Alter table course add constraint cno_pk primary key (cno)
    
    • 1

    2)为表course中的字段cname添加唯一值约束;

    Alter table course add constraint cname_nq unique (cname)
    
    • 1

    3)对于数据表sc的sno、cno字段定义为外码,使之与表student的主码sno及表course的主码cno对应,实现如下参照完整性:

    删除student表中记录的同时删除sc表中与该记录sno字段值相同的记录;
    修改student表某记录的sno时,若sc表中与该字段值对应的有若干条记录,则拒绝修改;
    修改course表cno字段值时,该字段在sc表中的对应值也应修改;
    删除course表一条记录时,若该字段在在sc表中存在,则删除该字段对应的记录;
    向sc表添加记录时,如果该记录的sno字段的值在student中不存在,则拒绝插入;

    [通过次表影响主表(外键表)]
    Alter table sc 
    Add constraint sc_fk
    foreign key sno references student(sno)
    Delete on cascade
    Update on no action,
    Foreign key cno references course(cno)
    Delete on cascade
    Update on cascade
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4 )定义check约束,要求学生学号sno必须为9位数字字符,且不能以0开头,第二三位皆为0;

    Alter table student
    Add constraint sno_ck
    Check(sno like [1-9]00[0-9][0-9][0-9][0-9][0-9][0-9])
    
    • 1
    • 2
    • 3

    5)定义stu数据库中student表中学生年龄值在16~25范围内;

    Alter table student
    Add constraint sage_ck
    Check(sage between 16 and 25)
    
    • 1
    • 2
    • 3

    6)定义stu数据库student表中学生年龄值默认值为20;

    Alter table student
    Add constraint sage_def default 20 for sage
    
    • 1
    • 2

    7) 修改student表学生的年龄值约束可以为15~30范围内;

    Alter table student
    Drop constraint sage_ck
    Go 
    Alter table student
    Add constraint sage_ck 
    Check(sage between 15 and 30)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    8) 删除表course中字段cname的唯一值约束;

    Alter table course 
    Drop constraint cname_uq
    
    • 1
    • 2

    实验题目(2)
    2. 以实验数据库为基础数据,编写以下触发器并测试。

    实验代码、实验过程(界面方式下的抓图)、实验结果(抓图) 1) 为表course建立一个 INSERT触发器,当插入的新行中课程学分(ccredit)的值不是1~6时,就激活该出发器,撤销该插入操作,并使用RAISERROR语句返回一个错误信。息

    Create trigger ccredit_insert on course Before insert
    As
    Declare @new_credit int
    Select @new_credit = ccredit from inserted
    If( @new_credit < 1 and @new_credit > 6 )
    Begin
    raiserror( “学分不符合要求!!”,10,16)
    rollback tran
    End
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2)为course表再创建一个UPDATE触发器,当更新了某门课程的课程号信息时,就激活该触发器级联更新sc表中相关的课程号信息,并使用PRINT语句返回一个提示信息。

    Create trigger cno_update on course after update
    As
    Begin
    Declare @new_cno char(9),@old_cno char(9)
    Selset @new_cno = cno from inserted
    Select @old_cno = cno form deleted
    Update sc set cno = @new_cno 
    where cno = old_cno
    Print ‘成功!’
    End
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3)为student表创建DELECT触发器,在删除中的一条记录的同时将sc表中的相应记录也删除。

    Create trigger sno_delete on student after delete
    As
    Begin
    Delete from sc 
    Where sno in (select sno from deleted)
    End
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4)创建INSTEAD OF触发器,当向sc表中插入记录时,先检查sno列上的值在student中是否存在,如果存在执行插入操作,如果不存在则提示“该学生不存在”。

    Create trigger sno_instead_of on sc instead of insert
    As
    Declare @new_sno 
    Select @new_sno = sno from inserted 
    If (sno not in (select sno from student)
    Begin
    Raiserror(‘该学生不存在!’,1016)
    Rollback tran
    End
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5)比较约束与触发器的执行顺序。(在一个表中创建CHECK约束和触发器,然后向表中插入一条不符合约束和触发器的记录,察看谁先发生作用。)

    题目四:创建了触发器insert
    题目五:创建约束
    alter table sc 
    add constraint grade_ck 
    check (grade between 0 and 100) 
    insert sc 
    values('200515066','01',1000) 
    
    insert 语句执行时首先验证约束,同时约束本身也有先后顺序(无默认约束)
    1 .验证非空约束(not null2 .验证主键约束(primary key)
    3 .验证唯一性约束(unique)
    4.再次验证相关Check(check)
    5.最后执行触发器,如果触发器中也必须保证不违反相关约束和Check
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    【XInput】游戏手柄模拟鼠标动作
    dbeaver怎么批量执行sql
    基于javaweb的在线化妆品商城系统(java+ssm+jsp+js+bootstrap+mysql)
    2020 款丰田雷凌车组合仪表上多个故障灯偶发点亮
    Redis设计与实现(五)| Sentinel哨兵
    Redis特殊“三巨头”
    PMBOK(项目管理实践指南)绝不是PMP考试的指定教材,看完你就知道
    黑盒子测试
    Mybatis-plus修改指定字段
    Vue实现面经基础版案例(路由+组件缓存)
  • 原文地址:https://blog.csdn.net/qq_52384627/article/details/125504575