近来用了下存储过程,简单的记录总结一下。
使用存储过程,可以对数据库进行更复杂写的逻辑处理。比如说,我要将一个表subscriber的最大id获取到,然后复制给另外一张表usage的auto_increment,就可以这样做。
1. 获取最大id
SET @m = (SELECT MAX(id) + 10000 FROM subscriber);
如果表是空的,那么获取的最大id就是null,这个可能导致后续语句执行出错,可以加一个判断,改为
SET @m = (SELECT ifnull(MAX(id),0) + 10000 FROM subscriber);
ifnull(par1,par2)的意思是,如果par1不是空,那就返回par1,否则返回par2
@m为所要使用的参数
2. 准备赋值AUTO_INCREMENT的sql语句,此处用到了concat函数
SET @s = CONCAT('ALTER TABLE usage AUTO_INCREMENT=', @m);
3. prepare并执行
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
4. 释放资源
DEALLOCATE PREPARE stmt1;
此处第二步也可以通过别的方法进行参数传递,比如:
SET @m = (SELECT min(id) FROM subscriber);
PREPARE stmt1 FROM "select * from subscriber where id=?";
EXECUTE stmt1 using @m;
DEALLOCATE PREPARE stmt1;
但是这种传参方法对于alter table auto_increment不起作用, update语句是可以的,亲测有效。