`

MySQL触发器、存储过程(转)

阅读更多
一个简单的例子

1.1. 创建表:

   create table t(s1 integer);

1.2. 触发器:

?
delimiter |
create trigger t_trigger before insert on t  for each row
begin set @x = "hello trigger";
       set NEW.s1 = 55;
end;
|
1.3. 如果触发器创建错误,可能只能删除了,至少我试过不能replace

   drop trigger t_trigger;

1.4. 当执行insert 时:

   insert into t values(1);

1.5. 会执行触发器t_trigger

   select @x,t.* from t;

1.6. 可以看到结果:

   



1.7可以使用 SHOW TRIGGERS; 查看新建的触发器

2. url查询哈希值的维护 触发器

    2.1 创建表 pseudohash。



2.2 创建触发器,当对表进行插入和更新时,触发 触发器


delimiter |
create trigger pseudohash_crc_ins before insert on pseudohash  for each row
begin set @x = "hello trigger";
       set NEW.url_crc=crc32(NEW.url);
end;
|
create trigger pseudohash_crc_upd before update on pseudohash  for each row
begin set @x = "hello trigger";
       set NEW.url_crc=crc32(NEW.url);
end;
|

delimiter ;

  2.3 插入操作

     insert into pseudohash(url) values("http://www.baidu.com");

     insert into pseudohash(url) values("http://www.163.com");

     2.4 查看表中数据(是进行更新操作之后的数据)



    2.5 更新

   update pseudohash set url = 'www.163.com' where id = 1;

   可以看到的是,插入和更新操作后,他们的 url_crc是不同的

----------------------------------------------------------------------------

    2.6  上面源于一个 对于url建立索引的例子,还有一种建立索引的方式: 在B+ 树上建立一个伪索引,和真正的索引不同,它还是在B+树 索引上进行查找,但是,使用的是 键的哈希值进行查找,而不是键本身,这样会加快查找

         2.6.1 创建urls 表,注意使用的是 memory存储引擎

    

CREATE TABLE `urls` (
  `url` varchar(255) DEFAULT NULL,
  `url_crc` int(11) DEFAULT '0',
  KEY `url` (`url`) USING HASH
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
     2.6.2 然后插入url和url_crc,例如

        insert into urls values('www.gougou.com',crc32('www.gougou.com'));

        像上面的那样,或者使用触发器



        2.6.3 然后查询的时候使用 hash索引查询

       select * from urls where url = "www.baidu.com" and url_crc = crc32("www.baidu.com");

       select * from urls where url_crc = crc32("www.baidu.com");

       select * from urls where url = "www.baidu.com"

      上面3个查询结果当然是一样的,但是速度上hash的快很多

3. 触发器 语法

    3.1  CREATE TRIGGER trigger_name trigger_time trigger_event

              ON tbl_name FOR EACH ROW trigger_stmt
              trigger_time是触发程序的动作时间。它可以是BEFORE或AFTERtrigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

·             INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
·             UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
·             DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
      3.2 可能遇到的问题
            如果你在触发器里面对刚刚插入的数据进行了 insert/update, 会造成循环的调用.

            如:

             create trigger test before update on test for each row update test set NEW.updateTime = NOW() where id=NEW.ID; END

            应该使用set:

            create trigger test before update on test for each row set NEW.updateTime = NOW(); END

     3.3 触发器 与存储过程

           触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL

       (允许存储程序通过参数将数据返回触发程序)。
          而存储过程  可以接受参数,将结果范围给应用程序
 
 
  MySQL触发器、存储过程、自定义函数、视图简单示例 

0.test数据库有userinfo用户信息表 和userinfolog用户信息日志表
1.建立一个userinfo表新增记录时的触发器 将新增日志加入到userinfolog
2.建立一个向userinfo表新增记录的存储过程
3.根据userinfo表的出生日期字段 我们将建立一个简单算得年龄的自定义函数
4.创建一个userinfo的视图 调用年龄函数
-------------
0.准备相关表
mysql> use test;
mysql> create table userinfo(userid int,username varchar(10),userbirthday date);
mysql> create table userinfolog(logtime datetime,loginfo varchar(100));
mysql> describe userinfo;
1.触发器
mysql> delimiter |
mysql> create trigger beforeinsertuserinfo
    -> before insert on userinfo
    -> for each row begin
    ->   insert into userinfolog values(now(),CONCAT(new.userid,new.username));
    -> end;
    -> |
mysql> delimiter ;
mysql> show triggers;
2.存储过程
mysql> delimiter //
mysql> create procedure spinsertuserinfo(
    -> puserid int,pusername varchar(10)
    -> ,puserbirthday date
    -> )
    -> begin
    ->  insert into userinfo values(puserid,pusername,puserbirthday);
    -> end;
    -> //
mysql> show procedure status like 'spinsertuserinfo';
mysql> call spinsertuserinfo(1,'zhangsan',current_date);
mysql> select * from userinfo;

3.自定义函数
mysql> update userinfo
    -> set userbirthday='2000.01.01'
    -> where userid='1';
mysql> drop function if exists fngetage;
mysql> delimiter //
mysql> create function fngetage(pbirthday date)
    -> returns integer
    -> begin
    ->  return year(now()) - year(pbirthday);
    -> end
    -> //
4.视图
mysql> create view viewuserinfo
    -> as select * ,fngetage(userbirthday) as userage from userinfo;
mysql> select * from viewuserinfo;
清除日志记录
mysql> truncate table userinfolog;
mysql> delete from userinfolog;MySQL触发器、存储过程
分享到:
评论

相关推荐

    mysql触发器+存储过程

    文件“MySQL存储过程.pdf”和“OReilly.MySQL.Stored.Procedure.Programming.rar”可能会提供关于如何创建、调用和管理MySQL存储过程的详细指南,而“MySQL触发器.rar”则可能包含触发器的创建、使用和优化方面的...

    MySQL触发器、存储过程、自定义函数、视图示例

    ### MySQL触发器、存储过程、自定义函数、视图示例 #### 一、MySQL触发器 触发器是一种特殊类型的存储过程,它被设计为在特定事件(如INSERT、UPDATE或DELETE操作)发生时自动执行。触发器可以用来强制业务规则、...

    mysql触发器之创建多个触发器操作实例分析

    本文实例讲述了mysql触发器之创建多个触发器操作。分享给大家供大家参考,具体如下: 这次记录的内容mysql 版本必须得是5.7.2+的哈,之前的会不好使的。废话不多说,咱们开始正文哈。 在mysql 5.7.2+版本之前,我们...

    MYSQL触发器与存储过程.ppt

    MySQL中的存储过程和触发器是数据库管理中两个重要的高级特性,它们极大地增强了数据库的灵活性和安全性,同时也优化了性能。 **存储过程**是预编译的SQL语句集合,存储在数据库服务器上,可以在需要时被调用执行,...

    mysql触发器之触发器的增删改查操作示例

    MySQL触发器是数据库管理系统提供的一种机制,用于在特定的数据操作(如INSERT、UPDATE、DELETE)发生之前或之后自动执行预定义的SQL语句。这些触发器可以用来实现复杂的业务规则,确保数据的一致性和完整性,或者...

    MySQL存储过程和触发器

    MySQL中的存储过程和触发器是数据库管理中两个重要的概念,它们极大地增强了数据库的功能和灵活性。 存储过程是一种预编译的SQL语句集合,它可以视为数据库中的一个可执行对象。存储过程有以下几个显著优点: 1. *...

    MYSQL触发器教程.doc

    MySQL触发器是数据库管理系统中的一种重要机制,它允许在特定的数据库操作(如INSERT、UPDATE、DELETE)发生前后自动执行一段预定义的SQL代码。触发器的引入是为了满足更复杂的数据完整性需求,提供数据验证、业务...

    Mysql存储过程游标触发器

    Mysql存储过程游标触发器

    MySQL数据库函数,触发器,存储过程

    通过深入学习和掌握MySQL的函数、触发器和存储过程,开发者能够更加高效地管理和操作数据库,解决复杂的数据处理问题,提升应用程序的性能。在实际项目中,熟练运用这些特性是数据库设计和优化的关键。通过"mysql...

    MySQL触发器.pdf

    ### MySQL触发器详解 #### 引言 MySQL触发器,作为MySQL 5.0版本引入的一项重要特性,为数据库管理提供了更为精细的控制能力。触发器允许在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行SQL语句,...

    mysql触发器教程

    MySQL触发器是一种存储在数据库中的特殊类型的存储过程,当特定的事件(如插入、更新或删除数据)发生时自动执行。它们允许用户定义一系列复杂的规则和逻辑,以便在数据库操作时执行额外的操作。 #### 二、MySQL...

    mysql触发器使用

    触发器是数据库中一种特殊的存储过程,当特定的事件(如INSERT、UPDATE或DELETE操作)在指定的表上发生时自动执行。它们主要用于实现复杂的业务规则,确保数据的一致性和完整性。 ### MySQL触发器基础 触发器由三...

    mysql触发器

    MySQL触发器是一种存储过程,它在用户执行数据修改操作(DML:Data Manipulation Language)时自动执行。触发器不是由用户直接调用,而是由数据库系统在特定事件触发时自动执行,这些事件通常包括插入新记录...

    mysql存储过程、触发器.pdf

    MySQL 存储过程和触发器详解 MySQL 存储过程是指一组为了完成特定功能的 SQL 语句集合。存储过程的优点包括: 1. 封装性:存储过程可以将多个 SQL 语句封装在一起,方便调用和维护。 2. 可增强 SQL 语句的功能和...

    mysql触发器.zip

    1. **触发器与存储过程的区别**:解释了触发器与存储过程在功能上的相似性和不同,以及何时选择使用触发器。 2. **触发器的层次结构**:如果涉及多表操作,可能会介绍如何设置和管理嵌套触发器。 3. **触发器的安全...

    数据库实验报告-存储过程、触发器

    通过这些实验步骤,学生能够深入理解存储过程和触发器的工作原理及其在实际数据库应用中的作用。同时,这些操作也展示了如何在数据库管理系统中编写和管理这些数据库对象,有助于提升数据库设计和管理能力。

    mysql触发器使用实例

    MySQL触发器是数据库管理系统中的一个重要特性,它允许在特定的数据操作(如INSERT、UPDATE或DELETE)发生时自动执行预定义的SQL语句。这为数据库的业务规则提供了强大的支持,可以确保数据的一致性和完整性。以下是...

    如何测试mysql触发器和存储过程

    MySQL触发器和存储过程是数据库管理系统中非常重要的两个特性,它们允许开发者在特定的数据操作上下文中执行自定义的逻辑。本文将详细介绍如何测试这两种数据库对象。 1. **创建测试环境** - 首先,我们需要创建一...

    MySql视图触发器存储过程详解

    MySQL中的视图、触发器和存储过程是数据库管理中常用的功能,它们可以帮助开发者更高效、安全地进行数据操作。下面将分别对这三个概念进行详细解释。 **视图(View)** 视图是一种虚拟表,它是由SQL查询结果形成的...

Global site tag (gtag.js) - Google Analytics