数据库系统原理课程总结7——存储过程,触发器,索引,ODBC

一、 存储过程和触发器实验

  1. 请在你选用的数据库平台上,针对你的应用场景,对如下操作至少各实现一个存储过程:
    1)单表或多表查询 2)数据插入 3)数据删除 4)数据修改
    答:存储过程设置:
    数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第1张图片

单表查询,查找user表中用户ID在设置的区间内的用户的所有信息:
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第2张图片

数据插入,这里使用的是批量插入,通过设置AUTOCOMMIT,让所有insert语句最后统一录入数据库,可以极大程度上减少插入时间,百万级数据插入用时20s左右,不这样的话用时50分钟:
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第3张图片

数据删除,删除user表中用户ID在设置的区间内的用户的所有信息:
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第4张图片

数据修改,对于指定用户ID的用户的指定属性修改为提供的新的数据:
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第5张图片

2.通过ODBC、OLEDB、JDBC或任意其他的途径,在前端程序(C/S或B/S模式)中调用所实现的后台存储过程。
答:在本次实验中,我使用的ODBC实现后台存储过程,使用的编译器为Dev C++。首先需要对于ODBC环境进行设置:
首先,下载MySQL的ODBC驱动程序。
之后,在电脑的ODBC数据源中导入MySQL,并对实验要进行操作的数据库进行链接,我这里使用的是zhihu_database数据库,在填写好端口和密码之后完成导入。
最后,调整Dev C++编译器的编译环境,否则会出现程序运行不报错,但是同时也不编译ODBC函数语句的情况。

导入ODBC:
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第6张图片
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第7张图片

Dev C++编译环境调整:如果不进行下图这一操作的话代码中的ODBC相关函数在编译器中不编译也不报错。出现这一情况的原因可能是因为导入的头文件中只是对函数进行了声明但是没有具体函数代码。
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第8张图片

使用ODBC调用后台存储过程:
程序的流程图如下:
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第9张图片

ODBC中调用后台存储过程部分代码(需要完成代码可以私信我):
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第10张图片

ODBC调用查询存储过程后的结果:
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第11张图片

3.在你的案例场景中,分别设计并实现一个由数据插入、数据更新、数据删除所引发的触发器(前触发或后触发都可以),测试触发器执行效果。
答:数据插入触发器:
实现功能:在answer表插入一条数据后,对question表对应的问题的回答数属性进行update调整,即回答数+1。

CREATE DEFINER=`root`@`localhost` TRIGGER `zhihu_database`.`answer_AFTER_INSERT` AFTER INSERT ON answer FOR EACH ROW
BEGIN
	declare id int;
    set id=new.问题ID;
    update question set 回答数=回答数+1 where 问题ID=id;
END

数据更新触发器:
实现功能:当用户修改自己提出的问题后,在question表中对于问题文本进行修改,那么之前的对应回答就没有了意义,所以在answer表中删除这一问题的所有回答。

CREATE DEFINER=`root`@`localhost` TRIGGER `zhihu_database`.`question_AFTER_UPDATE` AFTER UPDATE ON `question` FOR each row
BEGIN
	declare id int;
    set id=old.问题ID;
    delete from answer where 问题ID=id;
END

数据删除触发器:
实现功能:用户删除了自己提出的问题后,那么之前的对应回答就没有了意义,所以在answer表中删除这一问题的所有回答。

CREATE DEFINER=`root`@`localhost` TRIGGER `zhihu_database`.`question_AFTER_DELETE` AFTER DELETE ON `question` FOR EACH ROW
BEGIN
	declare id int;
    set id=old.问题ID;
    delete from answer where 问题ID=id;
END

触发器效果:在对answer表进行数据插入前的question表:
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第12张图片
执行插入语句:
在这里插入图片描述
插入后的question表:
数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第13张图片

二、索引实验

  1. 结合作业#3,针对你的数据库中的一个表,编写简单的数据查询(查询语句应包括单个涉及非主属性等值比较的查询条件,设该非主属性为A,具体属性结合业务背景)和数据插入语句,程序应能在终端或服务器以文件形式记录每次数据读写操作的耗时。
    答:我通过python语言实现了上述功能,注释掉的为执行SQL语句的部分,其中比较重要的是db.commit()语句,如果没有这句代码的话,程序中对于数据库的操作都不会真正的落实在数据库上。(举例说明,程序中可以插入100条数据,在程序中可以查询到这100条数据,也可以进行任何操作,但是程序结束,数据库不会有任何变化):
    数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第14张图片

    下图为指定的存储运行时间的TXT文件:
    在这里插入图片描述

  2. 无索引测试:执行查询(查询条件不包含主码,且不存在针对属性A建立的索引),记录不同数据规模下的查询时间,
    答:
    数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第15张图片

  3. 有索引测试:针对属性A建立索引,采用与2)中相同的查询,记录不同数据规模下的查询时间。
    答:设置了用户名的索引之后:
    数据库系统原理课程总结7——存储过程,触发器,索引,ODBC_第16张图片

  4. 分析实验数据,制作图表,比较有索引和无索引的情况下,查询时间随数据量增加的变化情况,分析导致实验结果的原因。
    答:在数据规模较小时,有无索引查询时间之间没有明显差距,但是随着数据规模的上升,有索引的查询时间会逐渐显现出优势,在数据规模达到了百万级的时候,有索引的查询时间是无索引查询时间的百分之一还不止。
    这是因为对于没有索引的情况,如果要对表进行查询,那么就需要对整个列表进行遍历,查询所用的时间和数据规模之间存在线性关系。而如果使用了索引,因为索引是对数据库表中一列或多列的值进行排序的一种结构,在数据结构优化之后,往往查询的时候就不需要对整个表进行查询,例如比较常用的B+树结构,查询的时候和数据规模之间的关系是对数关系,所以随着数据规模的上升,索引的优势会越来越明显。

你可能感兴趣的:(课程作业记录博客,数据库,odbc,触发器,存储过程)