MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
楼主: loveme
打印 上一主题 下一主题

[书籍] MySQL数据库应用从入门到精通 - 中铁出版社(转载)

[复制链接]
16#
 楼主| 发表于 2012-12-12 13:47:38 | 只看该作者
6.3  删除索引
索引的操作包括创建索引、查看索引和删除索引。所谓删除索引,就是删除表中已经创建的索引。之所以要删除索引,是由于这些索引会降低表的更新速度,影响数据库的性能,本节将详细介绍如何删除索引。
6.3.1  删除索引的语法形式
查看帮助文档发现,在MySQL数据库管理系统中删除索引通过SQL语DROP IINDEX来实现,其语法形式如下:
DROP INDEX index_name
        ON table_name
上述语句中index_name参数表示所要删除索引名字,table_name参数表示所要删除索引所在的表对象。
【实例6-14】执行SQL语句DROP INDEX,于数据库company里删除表对象t_dept中的索引对象index_dname_loc。具体步骤如下:
(1)执行SQL语句USE,选择数据库company,并通过SQL语句SHOW CREATE TABLE查看该数据库中表t_dept信息,具体SQL语句如下:
USE company;
然后查看已经存在表t_dept的定义信息,具体SQL语句如下:
SHOW CREATE TABLE t_dept \G
(2)为了校验数据库表t_dept中索引是否被使用,执行SQL语句EXPLAIN,具体SQL语句内容如下:
EXPLAIN
        SELECT * FROM t_dept WHERE dname=’cjgong’;
(3)执行SQL语句DROP INDEX,删除索引对象index_dname_loc,具体SQL语句如下:
DROP INDEX index_dname_loc
        ON t_dept;
(4)为了校验数据库company中是否还存在索引对象index_dname_loc,执行SQL语句SHOW CREATE TABLE,具体SQL语句内容如下:
SHOW CREATE TABLE t_dept \G
执行结果显示,t_dept表已经不存在索引对象index_dname_loc。
17#
 楼主| 发表于 2012-12-12 13:48:28 | 只看该作者
6.3.2  通过SQLyog软件删除索引
在客户端软件SQLyog中,不仅可以通过在“询问”窗口中执行DROP INDEX语句来删除索引,而且还可以通过向导来实现,具体步骤如下:
(1)在“对象资源管理器”窗口中,单击“company>表>t_dept>索引”节点前的加号,然后右键单击“index_dname_loc”节点,从弹出的快捷菜单中选择“删除索引”命令
(2)当单击“删除索引”命令时,就会弹出对话框来确定是否删除索引。当单击“是”按钮后,这时“对象资源管理器”窗口里“company>表>t_dept”中的索引节点里就没有任何索引对象
通过上述步骤,就可以成功删除索引对象。
18#
 楼主| 发表于 2012-12-12 13:49:19 | 只看该作者
6.4  小结
本章主要介绍在MySQL软件关于索引的操作,分别从数据库对象索引的基本概念和操作两方面介绍。其中前者主要介绍为什么要使用索引对象。而后者主要介绍了创建索引操作、查看索引操作和删除索引操作,详细讲解了普通索引、唯一索引、全文索引和多列索引等各种类型索引的相关操作。为了让读者掌握这些操作,分别通过SQL语句和SQLyog客户端软件这两种方式来介绍。
通过对本章的学习,读者不仅会掌握数据库对象索引的基本概念,而且还会熟练掌握索引的各种操作。
19#
 楼主| 发表于 2012-12-12 13:50:00 | 只看该作者
第8章  操作触发器
在MySQL数据库中,数据库对象表是存储和操作数据的逻辑结构,而本章所要介绍的数据库对象触发器则用来实现由一些表事件触发的某个操作,是与数据库对象表关联最紧密的数据库对象之一。在数据库系统中,当执行表事件时,则会激活触发器从而执行其包含的操作。
触发器的操作包含创建触发器、查看触发器和删除触发器,这些操作同样也是数据库管理中最基本、最重要的操作。
通过本节的学习,可以掌握在数据库中操作触发器,内容包含:
        触发器的相关概念;
        触发器的基本操作:创建、查看和删除。
20#
 楼主| 发表于 2012-12-12 13:50:58 | 只看该作者
8.1  为什么使用触发器
触发器(TRIGGER)是MySQL的数据库对象之一,该对象与编程语言中的函数非常类似都需要声明、执行等。但是触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发、激活从而实现执行。
那么为什么要使用数据库对象触发器呢?在具体开发项目时,经常会遇到如下实例:
        在学生中表拥有字段学生名字,字段学生总数,每当添加一条关于学生记录时,学生的总数就必须同时改变。
        在顾客信息表中拥有字段顾客名字,字段顾客的电话和字段顾客的地址缩写,每当添加一条关于顾客记录时,都需要检查电话号码格式是否正确,顾客地址缩写是否正确。
上述实例虽然所需实现的业务逻辑不同,但是它们也有共同之处,即都需要在表发生更改时,自动进行一些的处理。这时就可以使用触发器数据库对象,例如对于第一个实例,可以创建一个触发器对象,每次添加一条学生记录时,就执行一次计算学生总数的操作,这样就可以保证每次添加一条学生记录后,学生总数与学生记录数一致。查看帮助文档,可以发现MySQL软件在触发如下语句时,就会自动执行所设置的操作:
        DELETE语句,
        INSERT语句,
        UPDATE语句。
其他SQL语句则不会激活触发器。在具体应用中,之所以会经常使用触发器数据库对象,是由于该对象能够加强数据库表中数据的完整性约束和业务规则等。从MySQL 5软件开始才开始支持触发器数据库对象,所以本书的内容适用于MySQL 5或更高级之后的版本。
在SQLyog客户端工具的“对象资源管理器”中,每个数据库节点下都拥有一个树形路径结构。其实每个具体数据库节点下的每个子节点中都会存在数据库对象触发器。
21#
 楼主| 发表于 2012-12-12 13:52:16 | 只看该作者
8.2  创建触发器
触发器的操作包括创建触发器、查看触发器、以及删除触发器。本节将详细介绍如何创建触发器。按照激活触发器时所执行的语句数目,可以将触发器分为“一个执行语句的触发器”和“多个执行语句的触发器”。
8.2.1  创建有一条执行语句的触发器
查看帮助文档发现,在MySQL中创建触发器通过SQL语句CREATE TRIGGER来实现,其语法形式如下:
CREATE TRIGGER TRIGGER_NAME
        BEFORE|AFTER TRIGGER_EVENT
                ON TABLE_NAME FOR EACH ROW TRIGGER_STMT
上述语句中TRIGGER_NAME参数表上所要创建的触发器名字,在具体创建触发器时,触发器标识符不能与已经存在的触发器重复。除了上述要求外,推崇触发器名命名(标识符)为trigger_xxx或者tri_xxx;BEFORE和AFTER参数指定了触发器执行的时间,其中前者指在触发器事件之前执行触发器语句,后者指在触发器事件之后执行触发器语句;TRIGGER_EVENT参数表示触发事件,即触发器执行条件,包含DELETE、INSERT和UPDATE语句;TABLE_NAME参数表示触发事件操的表的名字;FOR EACH ROW参数表示任何一条记录上的操作满足触发事件都会触发该触发器;TRIGGER_STMT参数表示激活触发器后被执行的语句。
下面将通过一个具体的实例来说明如何创建触发器。
【实例8-1】执行SQL语句CREATE TRIGGER,在数据库company中存在两个表对象:部门表(t_dept)和日记表(t_diary),创建触发器实现当向部门表中插入记录时,就会在插入之前向日记表中插入当前时间,具体步骤如下:
(1)执行SQL语句DESC,查看数据库company中部门表(t_dept)和日记表(t_diary)的信息,具体SQL语句如下:
DESC t_dept;

DESC t_diary;
(2)执行SQL语句CREATE TRIGGER,创建触发器tri_diarytime,具体SQL语句如下:
CREATE TRIGGER tri_diarytime
        BEFORE INSERT
                ON t_dept FOR EACH ROW
                        INSERT INTO t_diary VALUES(NULL,'t_dept',now());
【代码说明】上述语句中创建了触发器tri_diarytime,当向部门表中插入任意一条记录时,就会在插入操作之前向表t_diary中插入当前时间记录。
(3)为了校验数据库company中触发器tri_diarytime的功能,可以向表t_dept中插入一条记录,然后查看表t_diary中是否执行插入当前时间操作。具体SQL语句如下:
INSERT INTO t_dept VALUES(1,'cjgongdept','ShangXi');
SELECT *
        FROM t_diary;
【代码说明】上述语句中首先向表t_dept中插入一条数据记录,然后查看表t_diary中数据记录。
执行结果显示,在向表t_dept中插记录之前,会向表t_diary中插入当前时间,从而可以发现tri_diarytime触发器创建成功。
(4)对于初级用户,当创建触发器时,经常会发生如图8.7所示的错误。之所以不能正确创建触发器“tri_diarytime”,是因为该触发器已经存在。
22#
 楼主| 发表于 2012-12-12 13:53:37 | 只看该作者

8.2.2  创建包含多条执行语句的触发器
查看帮助文档发现,在MySQL中创建触发器通过SQL语句CREATE TRIGGER来实现,其语法形式如下:
CREATE TRIGGER TRIGGER_NAME
        BEFORE|AFTER TRIGGER_EVENT
                ON TABLE_NAME FOR EACH ROW
                        BEGIN
                        TRIGGER_STMT
                        END
上述语句中比“只有一条执行语句的触发器”语法多出来了关键字BEGIN和END,在这两个关键字之间为所要执行的多个执行语句的内容,执行语句之间用分号隔开。
在MySQL软件中,一般情况下用“;”符号作为语句的结束符号,可是在创建触发器的时候,需要用到了“;”符号作为执行语句的结束符号。为了解决该问题,可以使用关键字DELIMITER语句,例如“DELIMITER$$”,可以用来实现将结束符号设置成“$$”。
下面将通过一个具体的实例来说明如何创建包含多条执行语句的触发器。
【实例8-2】执行SQL语句CREATE TRIGGER,在数据库company中存在两个表对象:部门表(t_dept)和日记表(t_diary),创建触发器实现当向部门表中插入记录时,就会在插入之后向日记表中插入两条记录,具体步骤如下:
(1)执行SQL语句DESC,查看数据库company中部门表(t_dept)和日记表(t_diary)的信息,具体SQL语句如下:
DESC t_dept;

DESC t_diary;
(2)执行SQL语句CREATE TRIGGER,创建触发器tri_diarytime2,具体SQL语句如下:
DELIMITER $$
CREATE TRIGGER tri_diarytime2
        AFTER INSERT
                ON t_dept FOR EACH ROW
                        BEGIN
                                INSERT INTO t_diary VALUES(NULL,'t_dept',now());
                                INSERT INTO t_diary VALUES(NULL,'t_dept',now());
                        END
                        $$
DELIMITER ;
【代码说明】上述语句中首先通过“DELIMITER $$”语句设置结束符号为“$$”,然后在关键字BEGIN和END之间编写了执行语句列表,最后通过“DELIMITER ;”语句将结束符号还原成默认结束符号“;”。
(3)为了校验数据库company中触发器tri_diarytime2的功能,可以向表t_dept中插入一条记录,然后查看表t_diary中是否执行插入当前时间操作。具体SQL语句如下:
INSERT INTO t_dept VALUES(2,'cjgongdept','ShangXi');
SELECT * FROM t_diary;
【代码说明】上述语句中首先向表t_dept中插入一条数据记录,然后查看表t_diary中数据记录。
执行结果显示,在向表t_dept中插记录之后,会向表tri_diarytime中插入两条记录,从而可以发现tri_diarytime2触发器创建成功。
23#
 楼主| 发表于 2012-12-12 13:57:13 | 只看该作者
4.2.2  通过SQLyog客户端软件来创建触发器
通过MySQL数据库服务器自带的工具“MySQL Command Line Client”来创建触发器,虽然高效、灵活,但是对于初级用户比较困难,需要掌握SQL语句。在具体实践中,用户可以通过客户端软件SQLyog来创建触发器。
下面将通过一个具体的实例来说明如何通过客户端软件SQLyog创建触发器。
【实例8-3】同实例【8-2】一样,于数据库company中创建触发器对象tri_diarytime2。
(1)首先连接数据库服务器,在“对象资源管理器”窗口中将显示MySQL数据库管理系统中所有的数据库,其中数据库company中存在两个表:表示部门的表t_dept和表示日记表t_diary;同时触发器节点里已经存在一个触发器tri_diarytime
(2)右键单击“对象资源管理器”窗口中“触发器”节点,在出现的菜单选择“创建触发/器”命令则会打开“Create Trigger”对话框。
(3)在出现的“Create Trigger”对话框中,设置“输入新触发器名称”文本框名为tri_diarytime2,然后单击“创建”按钮则会创建触发器tri_diarytime2
(4)当数据库触发器tri_diarytime2创建成功后,在出现关于触发器设计模板的“tri_diarytime2”窗口
(5)在“tri_diarytime2”设计模板窗口中,然后单击工具栏中的“执行查询”( )按钮,进行执行SQL语句。
(6)当数据库创建成功后,不仅会在“信息”窗口显示相关信息,而且当单击工具栏中的“刷新对象浏览器”( )按钮,会在“对象资源管理器”窗口中显示出新建的数据库
通过上述步骤,则可以在SQLyog客户端工具中于company数据库中创建触发器tri_diarytime2成功。
24#
 楼主| 发表于 2012-12-12 13:58:00 | 只看该作者
8.3  查看触发器
触发器的操作包括创建触发器、查看触发器、以及删除触发器。本节将详细介绍如何查看触发器。在MySQL软件中可以通过两种方式来查看触发器,分别为通过SHOW TRIGGERS语句实现和通过查看系统表triggers实现。
8.3.1  通过SHOW TRIGGERS语句查看触发器
对于初级用户,当创建触发器时,除了经常会发生“ERROR 1359 (HY000): Trigger already exists”错误之外
之所以不能正确创建触发器“tri_diarytime2”,除了是因为该触发器已经存在外还。还因为在MySQL软件中,一个表在相同触发时间的相同触发时间,只能创建一个触发器。因此对于有经验的用户,当在创建触发器之前,需要查看MySQL软件中是否已经存在该标识符的触发器和触发器的相关事件。
那么如何查看MySQL软件中已经存在的触发器呢?查看帮助文档可以发现,在MySQL软件中查看已经存在触发器通过SQL语句SHOW TRIGGERS来实现,其语法形式如下:
SHOW TRIGGERS \G
通过执行SQL结果可以发现,执行完“SHOW TRIGGERS”语句后,会显示一个列表。在该列表中,会显示出所有触发器的信息。其中Trigger参数表示触发器的名称;Event参数表示触发器的激活事件;Table参数表示触发器对象触发事件所操作的表;Statement参数表示触发器激活时所执行的语句;Timing参数表示触发器所执行的时间;其他参数不重要,现阶段不需要掌握。
25#
 楼主| 发表于 2012-12-12 13:59:16 | 只看该作者
8.3.2  通过查看系统表triggers实现查看触发器
在MySQL软件中,于系统数据库information_schema中存在一个存储所有触发器信息的系统表triggers,因此查询该表格的记录也可以实现查看触发器功能。关于系统表triggers的表结构
通过系统表triggers的结构,可以发现该表会提供触发器的所有详细信息。
【实例8-4】执行SQL语句SELECT,查询数据库company中触发器对象,具体步骤如下:
(1)执行SQL语句USE,选择数据库information_schema,具体SQL语句如下:
USE information_schema;
(2)执行SQL语句SELECT,查看系统表triggers中的所有记录,具体SQL语句如下:
SELECT * FROM triggers \G
【代码说明】关于查询语句的具体语法后面章节会详细介绍。
(3)执行结果显示了MySQL软件中所有的触发器对象的详细信息,除了显示所有触发器对象外,还可以查询指定触发器的详细信息,具体SQL语句如下:
SELECT * FROM triggers WHERE TRIGGER_NAME=’tri_diarytime2’ \G
【代码说明】关于查询语句的具体语法后面章节会详细介绍。
执行结果显示了所指定触发器对象tri_diarytime2的详细信息,跟前面的方式相比,使用起来更加方便、灵活。
对于MySQL软件用户来说,很少使用语句“SHOW TRIGGERS”和语句“SELECT * FROM triggers \G”来查询触发器的详细信息,因为在MySQL软件中,随着时间的推移,数据库对象触发器肯定会增多,如果查询所有触发器的详细信息,将显示许多许多的信息,不便于找到所需的触发器的信息。

26#
 楼主| 发表于 2012-12-12 13:59:53 | 只看该作者
8.3.3  通过SQLyog客户端软件来查看触发器
通过MySQL数据库服务器自带的工具“MySQL Command Line Client”来查看触发器,虽然高效、灵活,但是对于初级用户比较困难,需要掌握SQL语句。在具体实践中,用户可以通过MySQL客户端软件SQLyog来查看触发器。
对于MySQL客户端软件SQLyog,除了可以在“询问”对话框中执行“SHOW TRIGGERS”语句和SELECT语句来实现查询触发器详细信息外,还可以通过操作“对象资源管理器”来实现。具体步骤如下:
(1)首先连接数据库服务器,在“对象资源管理器”窗口中将显示MySQL数据库管理系统中所有的数据库,单击数据库company节点,将显示属于该数据库的所有数据库对象,具体信息如图8.25所示。
(2)单击数据库company中的“触发器”节点,将显示关于该数据库的所有触发器对象(tri_diarytime和tri_diarytime2)
(3)如果想查看触发器tri_diarytime的定义信息,只需要在“对象资源管理器”窗口中右键选择该触发器对象,然后在出现的菜单命令中选择“改变触发器”命令(如图8.27所示),则会出现关于该触发器对象定义信息的窗口
通过上述步骤,则可以在SQLyog客户端工具中查看触发器对象和这些对象的定义信息。
27#
 楼主| 发表于 2012-12-12 14:00:45 | 只看该作者
8.4  删除触发器
触发器的操作包括创建触发器、查看触发器、以及删除触发器。本节将详细介绍如何删除触发器。在MySQL软件中可以通过两种方式来删除触发器,分别为通过DROP TRIGGER语句和通过工具来实现删除触发器。
8.4.1  通过DROP TRIGGER语句删除触发器
查看帮助文档可以发现,在MySQL中删除触发器通过SQL语句DROP TRIGGER来实现,其语法形式如下:
DROP TRIGGER trigger_name
上述语句中,trigger_name参数表示所要删除的触发器名称。
【实例8-5】执行SQL语句DDROP TRIGGER删除触发器,于company数据库中删除触发器对象tri_diarytime。具体步骤如下:
(1)执行SQL语句USE,选择数据库company,具体语句如下:
USE company
(2)选择进入数据库company后,执行SQL语句DROP TRIGGER,删除名为tri_diarytime的视图对象,具体SQL语句如下:
DROP TRIGGER tri_diarytime
【代码说明】上述SQL语句中通过关键字DROP TRIGGER实现删除触发器功能。
(3)为了检验数据库view中是否还存在触发器对象tri_diarytime,执行SQL语句SHOW TRIGGERS,具体SQL语句内容如下:
SHOW TRIGGERS \G
执行结果显示,没有任何触发器对象,则表示删除视图tri_diarytime成功。
28#
 楼主| 发表于 2012-12-12 14:01:21 | 只看该作者
8.4.2  通过工具来删除触发器
在客户端软件SQLyog中,不仅可以通过在“询问”窗口中执行DROP TRIGGER语句来删除触发器,而且还可以通过向导来实现,具体步骤如下:
(1)在“对象资源管理器”窗口中,单击数据库company中“触发器”节点前的加号,然后右键单击“tri_diarytime”节点,从弹出的快捷菜单中选择“删除触发器”命令
(2)当通过右键单击“删除触发器”命令时,就会弹出对话框来确定是否删除触发器,如图8.33所示。当单击“是”按钮后,这时“对象资源管理器”窗口数据库company中“触发器”里就没有任何触发器对象
通过上述步骤,就可以在SQLyog软件中成功删除触发器对象。
29#
 楼主| 发表于 2012-12-12 14:02:25 | 只看该作者
8.5  小结
本节介绍在MySQL数据库管理系统中关于触发器的操作,主要包含触发器的创建、触发器的查看、以及触发器删除的操作。在具体介绍这些操作时,除了详细介绍针对触发器的SQL语句外,而且还介绍了客户端软件SQLyog针对触发器的这些操作。
通过对本章的学习,读者不仅会掌握数据库对象触发器的基本概念,而且还会对触发器进行各种熟练操作。

30#
发表于 2012-12-18 13:56:09 | 只看该作者
下载了,谢谢分享,顶一个~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-5-5 21:25 , Processed in 0.076581 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表