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 触发器学习
标签:
小编还为您整理了以下内容,可能对您也有帮助:
mysql触发器(MySQL触发器(定义、使用及示例))
MySQL触发器是一种特殊的存储过程,它是由MySQL服务器自动执行的一种数据库对象。当指定的事件发生时,触发器会被激活并执行相应的操作。这些事件可以是INSERT、UPDATE或DELETE语句的执行,也可以是表的创建或删除。MySQL触发器可以用于实现数据的自动更新、数据的验证和数据的审计等功能。
MySQL触发器的定义
MySQL触发器的定义包含以下几个部分:
1.触发器的名称:用于标识触发器的名称。
2.触发器的事件:触发器所要监控的事件,可以是INSERT、UPDATE或DELETE语句的执行,也可以是表的创建或删除。
3.触发器所在的表:触发器所要监控的表。
4.触发器的执行时间:触发器所要执行的时间,可以是BEFORE或AFTER。
5.触发器的执行语句:触发器所要执行的SQL语句。
MySQL触发器的使用
下面是一个MySQL触发器的示例:
```
CREATETRIGGER`trigger_name`BEFOREINSERTON`table_name`
FOREACHROWBEGIN
--触发器所要执行的SQL语句
END;
```
触发器的名称为`trigger_name`,它所要监控的事件是INSERT语句的执行,它所在的表为`table_name`,它所要执行的时间是BEFORE,它所要执行的SQL语句可以在BEGIN和END之间编写。
MySQL触发器的示例
下面是一个MySQL触发器的示例,该触发器在每次向`employee`表中插入新记录时,自动更新`department`表中的员工人数。
```
CREATETRIGGER`update_department_count`
AFTERINSERTON`employee`
FOREACHROWBEGIN
UPDATE`department`SET`count`=`count`+1WHERE`department_id`=NEW.`department_id`;
END;
```
该触发器的名称为`update_department_count`,它所要监控的事件是INSERT语句的执行,它所在的表为`employee`,它所要执行的时间是AFTER,它所要执行的SQL语句为UPDATE语句,它将`department`表中对应部门的员工人数加1。
MySQL触发器的注意事项
1.MySQL触发器只能在表级别上创建,不能在行级别上创建。
2.MySQL触发器可以使用NEW和OLD关键字来引用插入、更新或删除的行的值。
3.MySQL触发器可以使用IF和CASE语句来进行条件判断。
4.MySQL触发器可以使用RAISE_APPLICATION_ERROR函数来抛出异常。
如何利用MySQL数据库在插入数据后触发触发器
MySQL数据库支持触发器的功能,触发器是与表操作的对象有关。触发器在满足某种条件时触发,并要执行触发器中定义的SQL语句操作。还有触发器只能创建在真实表上,不能创建在临时表上;触发器的触发事件有before或after,下面利用一个具体实例说明插入数据后触发触发器,如下图所示:
1.第一步,创建数据库表t_class_info,利用创建表语句:
create table t_class_info(
id int(8),
t_no int(10),
t_name varchar(20),
t_addr varchar(60)
);如下图所示:
2.第二步,查看表t_class_info描述,利用命令:
desc t_class_info;如下图所示:
3.第三步,创建触发器info_tri,触发时间是在向表t_class_info插入数据后,触发事件是向表class_info中插入一条记录,如下图所示:
4.第四步,创建数据库表class_info,利用命令:
create table class_info(
id int(8),
t_no int(10),
t_name varchar(20),
t_addr varchar(60)
);如下图所示:
5.第五步,查看class_info数据库表结构,利用命令:
desc class_info;如下图所示:
6.第六步,查看数据库表t_class_info和class_info数据,发现两张没有数据,这时调用插入语句,向数据库表t_class_info里插入一条记录,并查看数据库表class_info是否新增记录,如下图所示:
说明
了解MySQL触发器的触发时间和条件
熟练使用MySQL触发器
mysql 触发器 怎么用?
方法/步骤
首先,我们需要确定自己的Mysql数据库的版本,因为my sql数据库是从5.0.2版本才开始支持触发器的。
我推荐大家在电脑的dos命令界面中输入 mysql --version,来获取mysql的版本号,注意version的两个横线和之前的mysql是有一个空格的。
上一步获取了我们的mysql版本号,这一不我们就开始建立触发器了。我采用的以视图加代码的方式创建,我们在数据表中找到要执行删除操作的表,然后右键设计表
这样我们就打开了表的设计页面,可以看到有一个触发器选项卡,我们点击“触发器”
可以看到对应的选项,我们在名里面添加我们需要新建的触发器的名字,在触发选项中选择before或者after,然后在插入、更新、删除三个选项中勾选一个。
这样我们就建立了一个名为“datri”的触发器,在删除操作执行之后触发
然后我们在下面的定义下面的框中输入我们需要执行的操作。然后点击sql预览,可以看到整个触发器的代码
最后就是保存了,由于我们做的是触发器,保存之后,在执行删除操作时,这个触发器才相当于 被执行。
追问不好意思 我知道触发器怎么创建 现在我有一个需求:当商品表的商品状态被修改为3(下架)或4(售出)的时候 获取当前被修改数据的UUID去商品库存表减少相应商品的库存减一 。您知道sql怎么写吗?mysql触发器简介及如何创建和删除触发器
什么是mysql触发器
需要MySQL 5 对触发器的支持是在MySQL 5中增加的。因此,本章内容适用于MySQL 5或之后的版本。
MySQL语句在需要时被执行,存储过程也是如此。但是,如果你想要某条语句(或某些语句)在事件发生时自动执行,怎么办呢?例如:
1.每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写;
2.每当订购一个产品时,都从库存数量中减去订购的数量;
3.无论何时删除一行,都在某个存档表中保留一个副本。
所有这些例子的共同之处是它们都需要在某个表发生更改时自动处理。这确切地说就是触发器。触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于 BEGIN 和 END 语句之间的一组语句):
1.DELETE ;
2.INSERT ;
3.UPDATE 。
其他MySQL语句不支持触发器。
创建mysql触发器
在创建触发器时,需要给出4条信息:
1.唯一的触发器名;
2.触发器关联的表;
3.触发器应该响应的活动( DELETE 、 INSERT 或 UPDATE );
4.触发器何时执行(处理之前或之后)。
保持每个数据库的触发器名唯一 在MySQL 5中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一。这表示同一数据库中的两个表可具有相同名字的触发器。这在其他每个数据库触发器名必须唯一的DBMS中是不允许的,而且以后的MySQL版本很可能会使命名规则更为严格。因此,现在最好是在数据库范围内使用唯一的触发器名。
触发器用 CREATE TRIGGER 语句创建。下面是一个简单的例子:
输入:
create trigger newproct after insert on proucts for each row select 'proct added';分析:CREATE TRIGGER 用来创建名为 newproct 的新触发器。触发器可在一个操作发生之前或之后执行,这里给出了 AFTER INSERT ,所以此触发器将在 INSERT 语句成功执行后执行。这个触发器还指定 FOR EACH ROW ,因此代码对每个插入行执行。在这个例子中,文本 Proct added 将对每个插入的行显示一次。为了测试这个触发器,使用 INSERT 语句添加一行或多行到 procts
中,你将看到对每个成功的插入,显示 Proct added 消息。
仅支持表 只有表才支持触发器,视图不支持(临时表也不支持)。
触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器(每条 INSERT 、 UPDATE和 DELETE 的之前和之后)。单一触发器不能与多个事件或多个表关联,所以,如果你需要一个对 INSERT 和 UPDATE 操作执行的触发器,则应该定义
两个触发器。
触发器失败 如果 BEFORE 触发器失败,则MySQL将不执行请求的操作。此外,如果 BEFORE 触发器或语句本身失败,MySQL将不执行 AFTER 触发器(如果有的话)。
删除mysql触发器
现在,删除触发器的语法应该很明显了。为了删除一个触发器,可使用 DROP TRIGGER 语句,如下所示:
输入:
drop trigger newproct ;分析:触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建。
【相关推荐】
1. mysql免费视频教程
2. MySQL使用字符集和校对顺序使用教程
3. MySQL字符集和校对顺序简介
4. MySQL事务-使用保留点、更改默认的提交行为详解
5. MySQL事务-ROLLBACK,COMMIT用法详解