触发器、索引、存储过程以及函数
2013-08-08 13:15
232 查看
触发器:trigger 作用: 监视某种情况并触发某种操作.
观察以下场景:
一个电子商城,
商品表, g
订单表, o
完成下单与减少库存的逻辑
Insert into o (gid,num) values (2,3); // 插入语句
Update g set goods_num = goods_num - 3 where id = 2;// 更新过程
这两个逻辑可以看成一个整体,或者说, insert ---> 引来 update
用触发器可以解决上述问题.
我们可以监视某表的变化,当发生某种变化时,触发某个操作.
触发器:
能监视: 增,删,改
触发操作: 增,删,改
四要素:
监视地点
监视事件
触发时间
触发事件
创建触发器的语法
Create trigger triggerName
After/before insert/update/delete on 表名
For each row #这句话是固定的
Begin
Sql语句; # 一句或多句,insert/update/delete范围内
End;
删除触发器的语法:
Drop trigger 触发器名
查看触发器
Show triggers
如何在触发器引用行的值
对于insert而言, 新增的行 用new 来表示,
行中的每一列的值 ,用new.列名来表示.
对于 delete来说, 原本有一行,后来被删除,
想引用被删除的这一行,用old,来表示, old.列名,就可以引用被删行中的值.
对于update来说,
被修改的行,
修改前的数据 ,用 old来表示, old.列名引用被修改之前行中的值
修改后的数据,用new 来表示, new.列名引用被修改之后行中的值
触发器里after 和before的区别
After 是先完成数据的增,删,改再触发,
触发的语句晚于监视的增,删,改,无法影响前面的增删改动作.
Before是先完成触发,再增删改,
触发的语句先于监视的增,删,改发生,我们有机会判断,修改即将发生的操作.
典型案例:
对于所下订单,进行判断,如果订单的数量 > 5 ,就认为是恶意订单,
强制把所订的商品数量改成5
---------------------------------------------------------------------------------------------------------------------
索引
索引:是针对数据所建立的目录.
作用: 可以加快查询速度
负面影响: 降低了增删改的速度.
索引的创建原则:
1:不要过度索引
2:在where条件最频繁的列上加.
3:尽量索引散列值,过于集中的值加索引意义不大.
索引的类型
普通索引: index 仅仅是加快查询速度.
唯一索引: unique index 行上的值不能重复
主键索引: primary key 不能重复.
主键必唯一,但是唯一索引不一定是主键.
一张表上,只能有一个主键, 但是可以用一个或多个唯一索引.
全文索引 : fulltext index
(上述3种索引,都是针对列的值发挥作用,但全文索引,可以针对值中的某个单词,比如一篇文章,)
建立索引
可以在建表时,直接声明索引,即在列声明完毕后,声明索引.
例如下:
create table test5 (
id int,
username varchar(20),
school varchar(20),
intro text,
primary key (id),
unique (username),
index (school),
fulltext (intro)
) engine myisam charset utf8;
查看一张表上所有索引
Show index from 表名
建立索引
Alter table 表名 add index /unique/fulltext [索引名] (列名)
Alter table 表名 add primary key (列名) // 不要加索引名,因为主键只有一个
删除索引
删除非主键索引:Alter table 表名 drop index 索引名;
删除主键: alter table 表名 drop primary key
关于全文索引的用法
Match (全文索引名) against ('keyword');
关于全文索引的停止词
全文索引不针对非常频繁的词做索引,
如this, is, you, my等等.
全文索引:在mysql的默认情况下, 对于中文意义不大.
因为英文有空格,标点符号来拆成单词,进而对单词进行索引.
而对于中文,没有空格来隔开单词,mysql无法识别每个中文词.
---------------------------------------------------------------------------------------
存储过程: procedure
概念类似于函数,就是把一段代码封装起来,
当要执行这一段代码的时候,可以通过调用该存储过程来实现.
在封装的语句体里面,可以用if/else, case,while等控制结构.
可以进行sql编程.
查看现有的存储过程:
Show procedure status
删除存储过程
Drop procedure 存储过程的名字
调用存储过程
Call 存储过程名字();
第1个存储过程 ,体会"封装sql"
第2个存储过程, 体会"参数"
第3个存储过程,体会"控制结构"
第4个存储过程,体会"循环"
在mysql中,存储过程和函数的区别,
一个是名称不同,
二个就是存储过程没有返回值.
观察以下场景:
一个电子商城,
商品表, g
主键 | 商品名 | 库存 |
1 | 电脑 | 28 |
2 | 自行车 | 12 |
订单主键 | 商品外键 | 购买数量 |
1 | 2 | 3 |
2 | 1 | 5 |
Insert into o (gid,num) values (2,3); // 插入语句
Update g set goods_num = goods_num - 3 where id = 2;// 更新过程
这两个逻辑可以看成一个整体,或者说, insert ---> 引来 update
用触发器可以解决上述问题.
我们可以监视某表的变化,当发生某种变化时,触发某个操作.
触发器:
能监视: 增,删,改
触发操作: 增,删,改
四要素:
监视地点
监视事件
触发时间
触发事件
创建触发器的语法
Create trigger triggerName
After/before insert/update/delete on 表名
For each row #这句话是固定的
Begin
Sql语句; # 一句或多句,insert/update/delete范围内
End;
删除触发器的语法:
Drop trigger 触发器名
查看触发器
Show triggers
如何在触发器引用行的值
对于insert而言, 新增的行 用new 来表示,
行中的每一列的值 ,用new.列名来表示.
对于 delete来说, 原本有一行,后来被删除,
想引用被删除的这一行,用old,来表示, old.列名,就可以引用被删行中的值.
对于update来说,
被修改的行,
修改前的数据 ,用 old来表示, old.列名引用被修改之前行中的值
修改后的数据,用new 来表示, new.列名引用被修改之后行中的值
触发器里after 和before的区别
After 是先完成数据的增,删,改再触发,
触发的语句晚于监视的增,删,改,无法影响前面的增删改动作.
Before是先完成触发,再增删改,
触发的语句先于监视的增,删,改发生,我们有机会判断,修改即将发生的操作.
典型案例:
对于所下订单,进行判断,如果订单的数量 > 5 ,就认为是恶意订单,
强制把所订的商品数量改成5
---------------------------------------------------------------------------------------------------------------------
索引
索引:是针对数据所建立的目录.
作用: 可以加快查询速度
负面影响: 降低了增删改的速度.
索引的创建原则:
1:不要过度索引
2:在where条件最频繁的列上加.
3:尽量索引散列值,过于集中的值加索引意义不大.
索引的类型
普通索引: index 仅仅是加快查询速度.
唯一索引: unique index 行上的值不能重复
主键索引: primary key 不能重复.
主键必唯一,但是唯一索引不一定是主键.
一张表上,只能有一个主键, 但是可以用一个或多个唯一索引.
全文索引 : fulltext index
(上述3种索引,都是针对列的值发挥作用,但全文索引,可以针对值中的某个单词,比如一篇文章,)
建立索引
可以在建表时,直接声明索引,即在列声明完毕后,声明索引.
例如下:
create table test5 (
id int,
username varchar(20),
school varchar(20),
intro text,
primary key (id),
unique (username),
index (school),
fulltext (intro)
) engine myisam charset utf8;
查看一张表上所有索引
Show index from 表名
建立索引
Alter table 表名 add index /unique/fulltext [索引名] (列名)
Alter table 表名 add primary key (列名) // 不要加索引名,因为主键只有一个
删除索引
删除非主键索引:Alter table 表名 drop index 索引名;
删除主键: alter table 表名 drop primary key
关于全文索引的用法
Match (全文索引名) against ('keyword');
关于全文索引的停止词
全文索引不针对非常频繁的词做索引,
如this, is, you, my等等.
全文索引:在mysql的默认情况下, 对于中文意义不大.
因为英文有空格,标点符号来拆成单词,进而对单词进行索引.
而对于中文,没有空格来隔开单词,mysql无法识别每个中文词.
---------------------------------------------------------------------------------------
存储过程: procedure
概念类似于函数,就是把一段代码封装起来,
当要执行这一段代码的时候,可以通过调用该存储过程来实现.
在封装的语句体里面,可以用if/else, case,while等控制结构.
可以进行sql编程.
查看现有的存储过程:
Show procedure status
删除存储过程
Drop procedure 存储过程的名字
调用存储过程
Call 存储过程名字();
第1个存储过程 ,体会"封装sql"
第2个存储过程, 体会"参数"
第3个存储过程,体会"控制结构"
第4个存储过程,体会"循环"
在mysql中,存储过程和函数的区别,
一个是名称不同,
二个就是存储过程没有返回值.
相关文章推荐
- 数据库的几个问题存储过程触发器函数创建以及sql优化
- 触发器,函数,索引,视图,存储过程的解析
- oracle 创建表,序列,索引,视图,触发器,函数,存储过程,定时器,包体
- oracle简单的存储过程和函数以及触发器的使用
- Java学习笔记之数据库(触发器、事物、索引、投影和除、视图、存储过程和函数 )含各种链)___ 一直补充
- 存储过程和触发器的区别以及存储过程和函数的区别
- 从已有数据库生成脚本来获得生成数据表、视图、函数、存储过程以及触发器的SQL语句
- 查看表、视图、索引、存储过程和触发器的定义的方法
- mysql查看所有存储过程,函数,视图,触发器,表《转》
- 索引、视图、存储过程和触发器
- oracle 游标,函数 function , 存储过程 PROCEDURE , 触发器 Trigger
- Oracle存储过程、存储函数以及Java程序调用存储过程和存储函数
- mysql查询存储过程和函数、视图、触发器
- ORACLE函数以及存储过程学习篇
- mysql查看所有存储过程,函数,视图,触发器,表
- mysql 导入导出数据库以及函数、存储过程的介绍
- 数据库字符集不一样导致函数或存储过程中使用的索引失效
- MySQL存储过程和函数以及游标使用详解
- mysql高级语法:变量声明, 游标, 函数, 存储过程, 循环体, 触发器
- Oracle 中重新编译无效的存储过程, 或函数、触发器等对象(转)