Mysql学习 - 触发器和存储过程

  • 我最开始使用触发器和存储过程是在学oracle的时候,做一个客户管理系统。。
    然后当时用的现在忘得差不多了,而且oracle和mysql在这方面也有点差别。。不得不说其实oracle还真的是比较好用的,mysql相比起来简单很多哈~

触发器

我在这说下mysql的,oracle的我也记不起来了。。

触发器:create trigger

create trigger trigger_name trigger_time trigger_event
on table_name for each row trigger_stmt

注意事项

  1. table_name 必须是永久性表,不能在temporary表和视图上使用。
  2. trigger_time是触发时间,before和after两个属性,一个是在激活语句之前触发,一个是在激活语句执行后触发。
  3. trigger_event大致有:insert/update/delete这三个。
  4. trigger_stmt就是执行语句。(多个语句用begin…end来包含)

例子

  1. 创建表格
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
  1. 创建触发器
 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 组合起来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值