Mysql学习 - 触发器和存储过程
2015-10-19 20:15
591 查看
我最开始使用触发器和存储过程是在学oracle的时候,做一个客户管理系统。。
然后当时用的现在忘得差不多了,而且oracle和mysql在这方面也有点差别。。不得不说其实oracle还真的是比较好用的,mysql相比起来简单很多哈~
触发器:create trigger
trigger_time是触发时间,before和after两个属性,一个是在激活语句之前触发,一个是在激活语句执行后触发。
trigger_event大致有:insert/update/delete这三个。
trigger_stmt就是执行语句。(多个语句用begin…end来包含)
创建触发器
这里我在begin中只用了一条语句,多条语句直接加载begin和end中间就好了.
在触发器之前和之后我还有两个语句
这句的意思是让mysql把结束符号变成 ‘//’ 默认是 ‘;’ 然后最后结束用 ‘//’来结束,再改回来delimiter ;
触发器大致就这个样子~这个当你在删除company记录的时候也删除contacts里的记录
这有个其他例子:
(from:http://dev.mysql.com/doc/refman/5.1/zh/triggers.html)
大致就这些~
(from:http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html)
这个例子肯定很简单了。。(记得分隔符~)
在procedure里参数分为IN(输入,调用时候要指定), OUT(返回值),INOUT我这里用cid作为IN输入类型。
然后就发现已经执行了~
函数我其实用的很少,等我下次用的时候再写吧~
这样就可以了
ALTER PROCEDURE 语句必须包括整个新过程。可使用 PROC 作为 PROCEDURE 的同义词。
语法 1
除第一个单词不同外,ALTER PROCEDURE 语句的语法与 CREATE PROCEDURE 语句的语法相同。Watcom 和 Transact-SQL 方言过程都可以使用 ALTER PROCEDURE 进行变更。
使用 ALTER PROCEDURE,过程上的现有权限会保持不变。如果执行 DROP PROCEDURE,紧接执行 CREATE PROCEDURE,则会重新指派执行权限。
语法 2
使用 SET HIDDEN 对关联过程的定义进行模糊处理,使之不可读。可以卸载该过程,然后将其重装到其它数据库中。
如果使用 SET HIDDEN,则使用调试程序进行调试不会显示过程定义,也无法通过过程分析获得过程定义。
不能将语法 2 和语法 1 组合起来。
然后当时用的现在忘得差不多了,而且oracle和mysql在这方面也有点差别。。不得不说其实oracle还真的是比较好用的,mysql相比起来简单很多哈~
触发器
我在这说下mysql的,oracle的我也记不起来了。。触发器:create trigger
create trigger trigger_name trigger_time trigger_event on table_name for each row trigger_stmt
注意事项
table_name 必须是永久性表,不能在temporary表和视图上使用。trigger_time是触发时间,before和after两个属性,一个是在激活语句之前触发,一个是在激活语句执行后触发。
trigger_event大致有:insert/update/delete这三个。
trigger_stmt就是执行语句。(多个语句用begin…end来包含)
例子
创建表格CREATE TABLE `company` ( `id` int(11) NOT NULL AUTO_INCREMENT, `company` varchar(20) NOT NULL, `phonenumber` varchar(12) NOT NULL, `email` varchar(40) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `contacts` ( `id` int(11) NOT NULL, `username` varchar(20) NOT NULL, `phonenumber` varchar(12) NOT NULL, `email` varchar(40) NOT NULL, `officephone` varchar(12) NOT NULL, `position` varchar(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
创建触发器
delimiter // create trigger insertcustomer after delete on company for each row begin delete from contacts; end // delimiter ;
这里我在begin中只用了一条语句,多条语句直接加载begin和end中间就好了.
在触发器之前和之后我还有两个语句
delimiter //
这句的意思是让mysql把结束符号变成 ‘//’ 默认是 ‘;’ 然后最后结束用 ‘//’来结束,再改回来delimiter ;
触发器大致就这个样子~这个当你在删除company记录的时候也删除contacts里的记录
这有个其他例子:
DELIMITER | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END |
(from:http://dev.mysql.com/doc/refman/5.1/zh/triggers.html)
大致就这些~
查看触发器:
show triggers \g
删除触发器:
DROP TRIGGER[schema_name.]trigger_name这里可以
drop trigger insertcutomer;
存储过程:
CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body
CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body
(from:http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html)
例子
直接看例子应该比较容易懂一点~create procedure deletecompany(in cid int) begin delete from company where id = cid; delete from contacts where id = cid; end; //
这个例子肯定很简单了。。(记得分隔符~)
在procedure里参数分为IN(输入,调用时候要指定), OUT(返回值),INOUT我这里用cid作为IN输入类型。
调用存储过程
call deletecompany('2');
然后就发现已经执行了~
函数我其实用的很少,等我下次用的时候再写吧~
删除存储过程
很简单和删除表格一样:drop procedure procedure_name;
这样就可以了
修改存储过程
ALTER PROCEDURE [ owner.]procedure-name RECOMPILE
ALTER PROCEDURE 语句必须包括整个新过程。可使用 PROC 作为 PROCEDURE 的同义词。
语法 1
除第一个单词不同外,ALTER PROCEDURE 语句的语法与 CREATE PROCEDURE 语句的语法相同。Watcom 和 Transact-SQL 方言过程都可以使用 ALTER PROCEDURE 进行变更。
使用 ALTER PROCEDURE,过程上的现有权限会保持不变。如果执行 DROP PROCEDURE,紧接执行 CREATE PROCEDURE,则会重新指派执行权限。
语法 2
使用 SET HIDDEN 对关联过程的定义进行模糊处理,使之不可读。可以卸载该过程,然后将其重装到其它数据库中。
如果使用 SET HIDDEN,则使用调试程序进行调试不会显示过程定义,也无法通过过程分析获得过程定义。
不能将语法 2 和语法 1 组合起来。
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜