前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇mysql数据库范文,相信会为您的写作带来帮助,发现更多的写作思路和灵感。
【 关键词 】 mysql;范式;数据表
The Structure Design Based on MySQL Database
Chang Da-jun
(College of Electrical And Information, Changchun Architecture & Civil Engineering Clllege JilinChangchun 130607)
【 Abstract 】 MySQL database is a kind of open source relational database with open cross platform, it is that its things and its related data in the form of a two-dimensional table data information description,at the same time, the MySQL provides the complete constraint operation,so as to guarantee data security.This paper is based on the relevant data and information of university research management platform,develop and study the structure relationship between the relevant data tables and data and data.
【 Keywords 】 mysql; paradigm; data table
1 引言
数据库作为信息管理工具,已然成为当今数据信息管理的重要管理平台。作为关系型数据库MySQL,由于其具有的开源性和跨平台性已经越来越多的被广大用户所使用。MySQL数据库可以实现多源化数据连接操作,包括网络连接、ODBC连接等,同时MySQL还提供优化查询系统,通过改系统查询操作可以提高查询效率和查询速度,从而提高用户对数据信息的处理过程。本文以高校科研管理的相关数据信息作为数据,通过建立科研立项信息表、管理机构信息表以及项目申请人信息表等多张表格,在MySQL数据库的信息管理平台上,进行相关表格中数据信息以及表与表之间的数据结构分析。
2 3NF范式
2.1 3NF概述
数据冗余是在数据处理方面需要解决的重要内容,数据冗余处理如何会直接影响最终数据处理结果。因此在设计数据库时候,特别是在关系型数据库的设计过程中,往往要提出不同规范即范式来规范数据操作,达到用户所需的要求。关系型数据库主要提供六种范式,但其中常用的是第三范式――3NF,其以第二范式为基础,消除函数间的依赖关系。
在3NF中,数据结构遵循第二范式中提出的数据信息定位化原则,也就是说在数据规范化的过程中,采用第三范式进行数据规范时要以第二范式作为数据规范操作基础,然后将第二范式得到的数据关系模式采用数据投影方式将数据关系进行分解,从而得到3NF范式关系模式集合,完成第三范式的数据规范化操作过程,达到较好的数据冗余处理结果。
2.2 3NF定义
在数据库的研究过程中,针对计算机及其相关技术发展的不同阶段,所给出有关第三范式的定义也是各不相同。在研究3NF前先给出有关第三范式传递函数的定义。
定义:如果XY,YZ,且YZ是非平凡函数依赖,但不成立YX和ZY,则称Z传递函数依赖于X,记作XYZ。
通过定义可以看出,在X、Y和Z三者之间存在相互依赖关系,也就是说假如存在一个关系集合R(u)所构成的关系模式,其中关系X和关系Y之间存在着关系X决定关系Y,然后关系Y又决定关系Z,因此Y依赖与X,而Z依赖与Y。
2.3 投影分解过程及其算法
第二范式虽然规范化了数据表格的操作,但在数据冗余消除、删除异常和插入异常等问题不能得到较好的解决,而第三范式却能较好解决上述问题的出现,因此对于第三范式在进行解决的过程中除了要依赖与第二范式外,还要采用投影分解方式来实现对数据表的分解过程,以达到第三范式对数据表的要求,具体投影分解步骤及其算法如下:
(1)设关系集合R及其最小函数依赖关系集合Rmin;
(2)求出R的最小函数依赖集Rmin;
(3)如果R中的关系集合等于函数依赖集合Rmin,则说明关系集合R∈3NF范式,结束第三范式分解过程;如果在Rmin的属性集合中不存在,但在R属性集合中存在的属性关系,则将相应属性从R中删除,从而构成一个新关系模式集合,将过程转向(2);如果存在某个函数依赖关系,即Rmin中依赖与R的所有属性关系,关系集合R将不能分解;但如果Rmin中存在有X依赖与Y的关系,则分解之后的关系包中应该应包含{XY}的关系集合,若有XY1,XY2,XY3......XYn都属于Rmin中的关系集合,则分解之后的关系集合包应该包含{XY1,Y2,Y3......Yn}。
通过上面对第三范式的投影分解算法及其步骤描述过程来看,当第(5)步中如果存在X不是非主属性,则Y对任意键值多存在函数传递依赖关系XYZ,因此关系集合R是3NF。否则不存在函数传递依赖关系,则不存在第三范式,需要进行上述步骤。
3 数据库结构设计
3.1 数据表设计
数据表格的建立是完成数据信息存储和信息处理的重要过程,根据高校科研信息管理平台建设以及完成对数据信息处理需要,建立相关数据表,用户信息表、申请教师信息表、申请学院信息表等。通过对高校科研信息管理需求分析所得到的结果可以规划出有关数据表,本文以院系及专业为例进行第三范式的投影分解过程来进行第三范式的研究。在院系及专业方面所涉及到的数据主要是学院编号、学院名称、专业编号及专业名称等,因此得到的数据如表1所示。
根据表1的描述可以看出,在该表中学院ID是作为该表中的主键,也就是说在该表中学院ID是完成该表数据索引的唯一键值,学院名称、专业ID和专业名只是作为非规范化数据信息,因此如果在完成数据信息插入、删除、修改等工作会出现数据信息操作错误,而在数据冗余方面也没达到较好的数据冗余处理,在使用该表来完成数据信息操作会出现较高的数据冗余,所以在用户管理上存在不便,同时在DBMS中的管理中也存在缺陷。
3.2 数据结构操作
为了减少数据冗余和有关插入、删除等误操作,对表1进行数据规范化处理。根据第三范式――3NF定义及其算法的描述,对表1进行投影操作,完成对数据信息分解和分化,以达到数据表格简化,实现数据结构优化目的。在整个数据结构优化操作过程中主要采用3NF范式的投影过程,将表1完成结构化和规范化,方便数据处理和数据保存等过程。根据3NF范式的要求,得到表2和表3。
表2主要作用是完成对申请教师所在学院信息的数据存储,根据高校科研管理信息平台设计的需要,将该表中的字段名collegeid设计为主键,是各个申请教师所在学院信息的区别表述。
表3主要作用是完成申请教师专业信息存储和处理,在设计该表过程中需要将dptid设置为该表关键字,即专业的唯一性。同时,在该表中以collegeid作为外键以达到表2和表1之间的依赖关系,完成第三范式的投影操作过程。
4 结束语
通过本文以高校科研管理平台中所涉及到数据表1的数据处理过程,以及采用第三范式完成对表2和表3的投影分解,可以看出3NF在对数据结构处理过程中降低数据冗余,使得数据更加完整和简捷。同时,对第三范式的使用,使得改系统在使用过程不会出现插入异常、删除异常等操作导致信息在读取上的错误信息。
参考文献
[1] 周炜,周敏刚.关系数据库二三范式判别算法[J].航空计算技术,2006年04期.
[2] 王振杰,颜虹,党少农.规范化数据库设计在医学数据管理中的应用[J].中国卫生统计,2009年03期.
[3] 欧阳林艳.无损BCNF分解算法的改进[J].洛阳师范学院学报,2015年02期.
基金项目:
吉教科合字[2014]第622号。
【关键词】 PHP语言 MySQL数据库 数据表 连接
一、引言
随着时代的飞速发展,科学技术手段水平的不断提高,人们对互联网的要求也越来越高,各类管理系统也成为了现代科技不可或缺的产物。
以PHP+MySQL为基础开发的管理系统,因为其独特的优点成为了各大公司管理系统建设的首要选择,而PHP与MySQL的连接更是各类管理系统的核心。
二、PHP语言简介
PHP(超文本预处理器)是一种广泛运用的开源脚本语言。语法吸收了C语言、Java和Perl的特点,可以嵌入到HTML中,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法,并提供了与各种数据库连接的函数。PHP是完全免费的,可以不受任何限制的获取源代码和自用下载,使得PHP的使用效率很高。
三、MySQL数据库简介
MySQL是一种开放源代码的关系型数据库管理系统,由瑞典MySQL AB公司开发,MySQL数据库因其体积小、速度快、总体拥有成本低而受到了中小企业的热捧。MySQL数据库是基于Linux操作系统开发出来的数据库,众所周知Linux是开放源码的操作系统,所以MySQL数据库也是开放源码的免费数据库,这也是MySQL数据库的最大优点,虽然其功能的多样性和性能的稳定性差强人意,但是依然有很多用户在使用。
四、创建数据库和数据表
以下操作均以本项目“饭卡智能管理系统”作为示例进行说明,数据库名称为ecard,用户信息表名称为:info_ user。
当然,在Mysql中创建数据库和数据表最简单的方法就是利用鼠标进行操作,而在这里,我主要谈论的是利用SQL语句进行设计。
在MySQL中创建数据库用CREATE DATABASE(ecard);语句实现。以防在后来数据库操作中因编码的问题而出现乱码的情况,在这里,我建议此步骤可以利用手动方法建立数据库,排序规则选择utf8-general-ci;
数据库建好之后就是创建数据表了,在Mysql中创建数据表的语句是:
CREATE TABLE info_user(ID INT(11) PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(25) NOT NULL,
Gender VACHAR(2) NOT NULL,
ID_card VARCHAR(35) NOT NULL ,
Phone VARCHAR(25) NOT NULL,
Password VARCHAR(25) NOT NULL,
Department VARCHAR(25) NOT NULL);
其中ID表示学号,Name表示姓名,Gender表示性别,ID_card表示身份证号,Phone表示联系方式,Password表示密码,Department表示院系。
到这里,数据库和数据表就已经建立成功了。
五、PHP语言连接MySQL数据库
在PHP中,要连接数据库,首先必须得创建与数据库对应的字段,这里主要讨论如何连接数据库,用到的语句为:
$link=mysql_connect(’localhost’,’root’,’’);连接数据库
mysql_select_db(’ecard’,$link);选择数据库
$ s q l = " S E L E C T * F R O M i n f o _ u s e r W H E R E ID=binary(’{$ID}’)";数据库查询语句
$res=mysql_query($sql,$link)or die("查询失败".mysql_ error($link));判断语句,如果执行成功则返回TRUE,执行不成功则返回FALSE
$arr=mysql_num_rows($res);返回结果集行的数目
$sql="INSERT INTO info_user(ID,Name,Gender,ID_ card,Phone,Password,Department) VALUES(’{$ID}’,’{$name}’,’{$gender}’,’{$ID_card}’,’{$Phone}’,’{$Password}’,’{$Department}’)";数据库插入语句
至此,PHP语言连接MySQL数据库成功。
六、结束语
学校在经费缺、人员少的情况下,利用信息化手段建设和应用饭卡管理系统,对于规范学校的管理系统具有极其重要意义。有利于提高饭卡的利用效率,提高学校后勤集团的工作效率和服务水平, 也给广大师生提供了便利。
参 考 文 献
关键词:MySQL;C API;多线程
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)16-30904-02
Based on C API MySQL Database Multi-threaded Access Methods
YU Cheng-gong
(Zhejiang Pharmaceutical College,Ningbo 315100,China)
Abstract:Currently,the database in all walks of life were widely used.In many commercial database software,SQL Server and Oracle are used more and therefore their prices are more expensive. This paper describes the MySQL database in single-threaded or multi-threaded programming environment using C API access to the MySQL database, and gives the corresponding code and analysis. The database is open source database, with a higher maturity level, and the community version can be used for free. It satisfies the need to use the C API access to the database of project development, and reduces development costs.
Key words:MySQL;C API;multi-threaded
1 引言
随着社会信息化的深入,数据库在社会各个领域被广泛应用。在这些数据库应用项目开发过程中,需要做两方面的决策:1. 使用何种数据库软件;2. 采用何种方式访问数据库。数据库软件的选择面比较宽,在目前众多商业数据库软件中,SQL SERVER 和ORACLE被较多的使用,当然这两个数据库软件的价格也较昂贵,本文选择可免费使用的MySQL数据库社区版本,MySQL库属于开源数据库,具有较高的成熟度和可靠性。数据库的访问方式有很多,可以使用ODBC、DAO、ADO等方法,这些方法简单直接但是效率不高,不适合大型复杂的系统使用,例如网络游戏的数据库系统开发需要考虑同时大量的数据库访问,因此访问的效率非常重要。基于C程序语言的高效率,使用C API访问数据库可以提高数据库的访问效率。基于以上两点,本文将介绍基于C API的MySQL数据库访问方法,给出在单线程和多线程程序环境下的具体代码和分析。
2 建表
为了方便说明数据库的访问,先建立一个数据库表TestTable,可以使用SQL语句创建该表,也可以使用MySQL提供的图形界面来创建。数据库表中字段如下:
该数据库表使用最常见的用户名和密码作为字段,本文将通过该表来实现不同程序环境下基于C API的数据库的访问方法。
3 单线程程序的数据库访问
单线程应用程序访问MySQL数据库相对简单,其过程包含以下几步:
(1)初始化MySQL库
(2)初始化数据库连接句柄
(3)连接数据库
(4)通过SQL语句操作数据库并处理相应数据
(5)关闭数据库连接
(6)结束MySQL库
通过这五个步骤即可实现数据库的访问,具体代码和分析如下:
//在main主函数中添加代码
//1.定义访问数据库所需变量
MYSQL * myData;
MYSQL_RES * res;
MYSQL_ROW row;
//2. 初始化MySQL库和数据库连接句柄
myData = mysql_init((MYSQL*) 0);
//3. 连接数据库,MYSQL_IP和MYSQL_PORT表示数据库的IP和端口
// MYSQL_ACCOUNT, MYSQL_PASSWORD表示数据库连接的帐号和密码
//MYSQL_DBNAME表示所要访问的数据库名
mysql_real_connect( myData, MYSQL_IP, MYSQL_ACCOUNT, MYSQL_PASSWORD, MYSQL_DBNAME, MYSQL_PORT,NULL, 0 )
//4. 通过SQL语句操作数据库并处理相应数据
//4.1新建用户名为abcdef,密码为123456的记录
mysql_query(myData, "insert into TestTable value(‘abcdef’,’ 123456’)");
//4.2显示所有记录
//查询所有记录
mysql_query(myData, "select * from TestTable");
//将查询结果保存到res中
res = mysql_store_result( myData ) ;
//逐条显示记录
Int j = 0;
while ( row = mysql_fetch_row( res ) ) {//获取一条记录
j = mysql_num_fields( res ) ;//获取每条记录的字段数
for ( k = 0 ; k < j ; k++ )
printf( “%s”, row[k] ) ;
printf( “\n”) ;
}
//释放res
mysql_free_result( res ) ;
//5. 关闭数据库连接
mysql_close( myData );
//6. 结束MySQL库
mysql_library_end();
关于代码的几点说明:
(1)定义变量中的三个数据结构为访问MySQL所需,MYSQL结构表示一个数据库连接的句柄,其中包含了数据库连接所需的参数,MYSQL_RES结构表示数据库访问中一个查询的返回结果,MYSQL_ROW结构表示返回结构中的一条记录;
(2)获取查询结果res并处理完毕,必须释放res,否则会造成内存泄露
(3)在单线程时,步骤初始化MySQL库和数据库连接句柄可合并, 由mysql_init()来处理。该函数会自动调用函数mysql_library_init()来初始化MySQL库,同时初始化连接句柄。
4 多线程环境下的数据库访问
多线程环境下的数据库访问需要保证线程安全。Windows版本的MySQL C API函数都是线程安全的,除了mysql_library_init(),而我们刚才的代码中使用的mysql_init()函数会自动调用函数mysql_library_init()来初始化MySQL库,因此在多线程环境下,需要不同的初始化代码和清理代码。具体过程如下:
(1)在主函数中调用mysql_library_init()来初始化MySQL库;
(2)启动各数据库访问线程
(3)主函数等待各个线程的结束
(4)调用mysql_library_end ()清理MySQL库。
其中数据库访问线程的代码和单线程数据库访问代码类似,但是需要如下变化:
(1)单线程中的第2步初始化MySQL库和数据库连接句柄,不能再使用mysql_init(),代码应作如下修改:
//初始化线程
my_init();
mysql_thread_init();
//初始化myData
myData = malloc(sizeof(MYSQL));
memset(&myData, 0, sizeof(MYSQL))
(2)上述初始化myData,只是将myData所有成员设为0,如果有需要可以根据具体情况设置该结构成员的值,例myData->reconnect= 1,其作用是设置数据库连接属性为重连接,即当数据库连接断开时,自动重新连接;
(3)单线程中的第6步不在需要,改为结束线程的清理工作,即调用mysql_thread_end()函数。
5 总结
综上所述,使用C API访问MySQL数据库在不同线程环境下的区别主要在于初始化和访问结束后清理代码,也就是说除了初始化和清理代码,MySQL提供给我们的C API函数都是线程安全的。最后需要有一点说明,使用C API访问数据库可以提高数据库的访问效率,但并不是所有的数据库项目都适合这种方式,该方式适合需要大量实时并发处理的数据库项目,例如网络游戏的数据库项目,对于有此需求的数据库项目可参考本文。
参考文献:
【关键词】Mysql数据库 图书管理 系统安全 研究
SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言。Mysql可以说是目前最为流行的开源数据库管理系统软件,是一个真正的多用户、多线程SQL数据库服务器。Mysql开放源码,快捷灵活、稳定和容易使用等优点决定了其在中小型管理系统应用的优势。本文以基于Mysql网络数据库的图书管理系统为例,从安全稳定性要求和采取的安全策略等方面进行分析研究。
1 Mysql在信息管理系统的应用与优势
1.1 Mysql的基本特性与应用
Mysql与其他大型数据库Oracle、DB2、SQL Server等相比,有自身的不足之处,但是没有影响到Mysql在信息管理系统的应用。在个人或者是中小型的企业,Mysql发挥了自身的优势与作用。Mysql开放源码,具有快捷灵活、稳定和容易使用等优点,并有效的提供了PHP、C,C++,JAVA和HTML等主流前端开发软件的API接口。支持多种操作系统包括Windows 、Linux 、Solaris、Mas OS等。目前,搭建动态网站或者服务器的开源软件组合有典型的网络架构LAMP,极大地方便了开发者。Mysql应用非常广泛,Google、facebook、等使用Mysql作为网络数据库。
1.2 Mysql应用于图书管理系统的优势
Mysql应用于图书管理系统的优势主要分为三个方面,一是免费开源优势,如果再使用linux操作系统,可以减少购买操作系统和数据库的开销。二是多种平台支持的优势,Mysql可以与多个平台进行有效的连接,实现信息资源的共享。三是中小型数据库灵活稳定的优势,在设计Mysql程序的时候,加入了SQL中没有的一些补充条件,更加的适用于在中小型数据库中使用。图书管理系统通常要保存用户信息、图书信息和借阅信息,以及建立相关的书籍查询等,数据仓库并不是很庞大,因此,使用Mysql来管理数据非常合适。
2 基于Mysql的图书管理系统安全稳定性分析
高校图书管理系统是基于互联网的网络数据库,通常采用B/S的体系结构,因此,在浏览器层、Web 服务器层、数据库服务器层都会存在安全性要求,以及在操作系统、网络技术等方面的安全问题。只有控制好图书管理系统的安全问题,才能保证信息资源的有效共享。
基于网络数据库的图书管理系统的安全稳定性具有以下几个特点:
(1)较高的稳定性,包括操作系统的稳定性和数据库系统的稳定性,要保持Mysql数据库的正常运行轨迹。
(2)数据的保密性能,对客户信息、访问浏览量、客户端等进行有效的保密。
(3)运行的速度很快,包括浏览器端、数据库服务器端的访问速度,以保证数据信息在查找、修改等方面的快速反应。
(4)数据的备份与数据的恢复功能。数据库服务器中,包括图书信息、借阅图书记录、客户账号等在内的相关数据的安全问题,是保证图书管理系统正常运转的重要因素。要采取严格的防范措施,同时,当发生数据故障的时候,要在最短的时间内恢复数据与系统。
3 基于Mysql的图书管理系统安全稳定性策略
图书管理系统通常采用三层B/S结构模式,即用户层、Wed服务器层和数据库层。图书管理系统要注意提高数据库安全、操作系统安全和网络安全技术等方面的安全策略。
3.1 优化数据库设计
比如,在遵循关系模式规范化的基础上,优化表设计适当增加中间表或增加冗余字段以减少连接查询所花的时间,优化JOIN操作和子查询尽量使用全连接避免产生中间表,尽量避免LIKE 关键字和通配符进行查询。另外,还可以修改my.ini文件,对相关参数如sort_buffer_size 、read_buffer_size 、query_cache_size、max_connections等,设置合适的缓冲区大小和MySQL允许的最大连接进程数,以优化服务器提高系统性能,提高保证图书信息资源查询效率。
3.2 数据容灾与备份机制
要定期地进行数据备份,保护图书书目数据、流通数据、客户信息等。定期的进行数据库的重组工作,增强数据库的使用性能。用好MYSQL的容灾与备份机制,比如:建立主从数据库集群,采用 MySQL 复制;制定数据库备份/恢复计划;启动数据库服务器的二进制变更日志;定期检查数据表;定期对备份文件进行备份;把 MySQL 的数据目录和备份文件分别放到两个不同的驱动器中,等等。
3.3 帐户安全策略
可以从账户安全检查、系统内部安全措施、哈希加密等方面着手进行。比如,检查用户表mysql.user是否有匿名空账号(user=‘’ ),如有应将其删除。使用哈希加密帐户密码。加强客户的登录认证,尤其是服务器主机的登录认证。在主数据库创建从数据库操作所用的用户,并指定使用SLL 认证等等。
3.4 网络安全和操作系统安全策略
在网络安全策略方面,利用NAT技术,有效的防止发生来自网络外部的攻击现象,将局域网络内部的计算机系统进行隐蔽。正确设置计算机操作系统,确保客户使用真实身份,登录具有合法性。此外,还可以设置系统的实时监控,优化网络防火墙、文件加密以及杀毒软件技术的升级,等等。
4 结语
综上所述,要确保基于Mysql在图书馆管理系统的安全稳定性能,要考虑很多种因素的影响,在数据库设计、数据库服务器、数据容灾与备份、帐户安全,以及计算机网络、操作系统等方面进行优化配置。图书管理系统的安全与稳定性能保证了信息数据的安全、稳定性与高效,保证了客户在不同的时间、地点、平台中有效的使用图书馆的资源信息共享。
参考文献
[1]晋征.论基于网络数据库的图书馆管理系统安全性研究与实现[J].网络安全技术与应用,2015(3):27-29.
[2]阳学军.基于网络和人工智能的图书馆信息管理系统研究[J].岳阳职业技术学院学报,2005(3):59-61.
[3]林爱鲜.基于神经网络的图书馆管理系统的构建研究[J].电脑与电信,2012(4):48-50.
[4]田华.图书馆分布式数据库安全技术研究[J].现代情报,2007(4):161-163
关键词: 数据库; 完整性; 触发器; MySQL
中图分类号:TP311 文献标志码:A 文章编号:1006-8228(2014)04-66-03
Abstract: The trigger is a special storing procedure, and a major method to force the business rules and control the data integrity. The control mechanism of data integrity according to trigger technology in MySQL is discussed, mainly work principle and implementation process with examples of analysis and design. In connection with the emphasis and difficulty of trigger in database learning, the understanding and using introduction of trigger in MySQL are given.
Key words: database; integrity; trigger; MySQL
0 引言
随着计算机技术的发展,数据已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。数据库技术已经成为计算机信息系统与应用系统的核心技术和重要基础。数据库是一门理论与实践紧密结合的课程,它作为计算机及相关专业的骨干课程,在教学中占有重要的位置[1]。触发器是这门课程中的一个重点,触发器的灵活性增加了学生学习的难度,是该门课程的难点之一[2]。
触发器是与表事件相关联的特殊存储过程,它们不能直接执行,只在发生针对表的insert、update、delete事件时触发。用户不能绕过触发器,除非触发器向客户端发送消息,否则最终用户将不会意识到触发器的存在。
触发器的开发涉及多种SQL技术。要开发出良好的触发器,必须理解事务的流程和锁定、SQL以及存储过程。触发器包含几个独特的元素,开发人员必须对其进行仔细规划,并通过触发器实现复杂的业务规则和数据验证功能。
有些DBA反对使用触发器,因为它们是专用的。如果将数据库移植到其他平台,必须重写大部分触发器代码。另外,触发器还被指责影响性能。然而,如果规则过于复杂,无法使用约束来实现,则只能使用触发器来实现。业务规则在服务器外实现就不是规则了,而只是建议。设计糟糕的触发器将影响性能,但设计良好的触发器不但可以确保数据完整性,还能提供良好的性能[3]。
1 基本概念
触发发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。与存储过程不同的是,存储过程通过其他程序来启动运行,而触发器由一个事件来启动运行,并且触发器不能接收参数[4]。
数据库触发器有以下作用。
⑴ 安全性:可以基于数据库的值使用户具有操作数据库的某种权利。
⑵ 审计:可以跟踪用户对数据库的操作,审计用户操作数据库的语句,把用户对数据库的更新写入审计表。
⑶ 实现复杂的数据完整性规则:实现非标准的数据完整性检查和约束,触发器可产生比规则更为复杂的限制,与规则不同,触发器可以引用列或数据库对象。例如,触发器可以回退任何借出去的书超过库存的数量。
⑷ 实现复杂的非标准的数据库相关完整性规则。触发器可以对数据库中相关的表进行连环更新。
⑸ 同步实时地复制表中的数据。
⑹ 自动计算数据值。如果数据的值达到了一定的要求,则进行特定的处理。例如,某本书的库存低于一定指标,则立刻向图书管理员发出警告数据。
2 创建触发器
只有具备super权限的MySQL用户才能执行创建触发器的命令。创建触发器命令格式如下:
CREATE TRIGGER trigger_name BEFORE|AFTER
INSERT|UPDATE|DELETE ON table_name FOR
EACH ROW CODE.
触发器是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
触发器与命名为table_name的表相关,table_name必须引用永久性表,MySQL中不能将触发器与TYEMPORARY表或视图关联起来。
{ BEFORE | AFTER }:触发器有执行的时间设置,可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE }:同样也能设定触发的事件,它们可以在执行INSERT、UPDATE或DELETE的过程中触发。
FOR EACH ROW:触发器的执行间隔,FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
触发器的触发事件可以是下列三种之一。
⑴ INSERT:将新行插入表时激活触发器程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
⑵ UPDATE:更改某一行时激活触发器,例如,通过UPDATE语句。
⑶ DELETE:从表中删除某一行时激活触发器,例如,通过DELETE和REPLACE语句。
请注意,触发事件与表操作方式激活触发程序的SQL语句并不很类似,这点很重要。例如,关于INSERT的BEFRORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。
对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一张表,不能有两个BEFORE UPDATE触发程序。但可以有一个BEFORE UPDATE触发程序和一个BEFORE INSERT触发程序,或一个BEFORE UPDATE触发程序和一个AFTER UPDATE触发程序。
CODE是当触发程序激活时执行的语句。如果打算执行多个语句,可使用BEGIN…END复合语句结构。这样,就能使用存储子程序中允许的相同语句了。
另外,触发器执行的语句有以下两个限制。
限制⑴:触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL语句,但是允许存储程序通过参数将数据返回触发程序。也就是存储过程或者函数通过OUT或者INOUT类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。
限制⑵:不能在触发器中使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、COMMIT或者ROLLBACK。
3 删除触发器
目前,并没有ALTER TRIGGER语句,不过可以先使用DROP TRIGGER语句(删除触发器),然后再使用CREATE TRIGGERA语句创建一个新的触发器。
删除触发器的命令格式如下:
DROP TRIGGER[IF EXISTS] trigger_name
这条语句用于删除触发器。当触发器不存在时,使用关键字IF EXISTS可以避免出现出错信息。若不使用该关键字,它会生成一个注释,在执行SHOW WARNINGS语句后,可以显示该注释。可以指定与触发器关联的数据库或模式。如果不指定,将使用当前默认数据库。从MySQL5.1.6版本开始,该语句需要具有与给定触发器相关的表的TRIGGER权限,方能执行。在以前的MySQL版本中,它仅需要SUPER权限即可执行该语句。如果对MySQL5.0.10版本或更老版本升级时,请确保删除它的所有触发器,因为使用旧版本的触发器会带来问题。
4 OLD和NEW
NEW.column_name或者OLD.column_name,这样在技术上处理(NEW|OLD.column_name)新和旧的列名属于创建了过渡变量("transition variables")。对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以同时使用NEW和OLD。
5 触发器在图书管理系统中的应用
触发器程序将用到以下三张表:
⑴ Publiser(pub_id,pub_name,pub_tel,pub_web, pub_addr)
出版社(出版社_id,出版社名,电话,网址,地址)
⑵ Borrow_book(borrow_id,out_date,in_date,renew_count,renew_date,over_time,over_payment)
借阅(借阅_id,借出日期,归还日期,续借次数,续借日期,超期时间,超期费用)
⑶ Reader(reader_id,user,password,create_date,name,borrow_count)
读者(借书证号,用户名,密码,注册日期,姓名,借阅数量)
例1 当从publiser表中更新数据时,希望向另两个表中写入数据,保存更新前后的信息。
新建两张与publiser结构一样的表old_publiser与new_publisher。
DELIMITER |
CREATE TRIGGER tri_publisher_update
AFTER UPDATE
ON publisher FOR EACH ROW
/*保存更新前的信息*/
BEGIN
INSERT INTO old_publisher
(pub_id,pub_name,pub_tel,pub_web, pub_addr)
VALUES
(OLD.pub_id,OLD.pub_name,OLD.pub_tel,OLD.pub_web,
OLD.pub_addr);
/*保存更新后的信息*/
INSERT INTO new_publisher
(pub_id,pub_name,pub_tel,pub_web, pub_addr)
VALUES
(NEW.pub_id,NEW.pub_name,NEW.pub_tel,NEW.pub_web,
NEW.pub_addr);
END |
DELIMITER;
验证该触发器:
UPDATE publisher SET pub_tel=’010-6832629
4’ WHERE pub_id='P00002';
SELECT * FROM old_publisher;
SELECT * FROM new_publisher;
例2 借书触发器
DELIMITER |
CREATE TRIGGER tri_borrow_book_insertli
AFTER INSERT ON borrow_book
FOR EACH ROW
/*借书在borrow_book表插入新纪录时,自动更新读者表的已借数量*/
BEGIN
UPDATE reader SET borrow_count=borrow_count+1
WHERE reader_id=NEW.reader_id;
END |
DELIMITER;
例3 还书触发器
DELIMITER |
CREATE TRIGGER tri_borrow_book_update
AFTER UPDATE ON borrow_book
FOR EACH ROW
/*还书时更新borrow_book 表时,自动更新读者表的已借数量*/
BEGIN
IF ISNULL(OLD.return_date) AND NOT ISNULL
(NEW.return_date) THEN
UPDATE reader SET borrow_count=borrow_count-1
WHERE reader_id=NEW.reader_id;
END IF;
END |
DELIMITER;
6 结束语
本文从理论教学和实践教学两个方面对MySQL数据库中触发器的实现进行了探讨,并应用到了浙江农林大学数据库类课程的教学当中。实践表明该方法提高了学生对MySQL触发器学习的积极性,使他们能轻松掌握触发器的实现过程。教学效果和学生的学习效率得到了提高。
参考文献:
[1] 吴达胜,刘丽娟.《数据库原理与技术》的理论与实践教学的整体优化研究[J].计算机时代,2005.11:31-32
[2] 刘丽娟,吴达胜.滚动式分层教学在数据库课程中的应用[J].科技信息,2009.36:127-130