zoukankan      html  css  js  c++  java
  • mysql 触发器学习

    mysql 触发器学习

     

    1. 一个简单的例子

    1.1. 创建表:

       create table t(s1 integer);

    1.2. 触发器:

    delimiter |
    create trigger t_trigger before insert on 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

           (允许存储程序通过参数将数据返回触发程序)。 

              而存储过程  可以接受参数,将结果范围给应用程序

        
  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/u0mo5/p/4220337.html
Copyright © 2011-2022 走看看