oracle sequence的用法
1、首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限
CREATE SEQUENCE seqTest
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
2、得到Sequence值
CurrVal:返回 sequence的当前值
NextVal:增加sequence的值,然后返回 增加后sequence值
在Sql语句中可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- INSERT语句的values中
- UPDATE 的 SET中
摘抄自:http://www.cnblogs.com/hyzhou/archive/2012/04/12/2444158.html
MySQL存储过程
一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。优点是执行效率和SQL 代码封装。业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高。
存储过程与函数区别:
函数区别与存储过程的唯一的特点是:函数必须有返回值;
存储函数的参数类型类似于IN参数;
存储过程的参数类型有三种、IN参数、OUT参数、INOUT参数;
学习基础参考:http://blog.csdn.net/juanna_ding/article/details/5381188
http://www.cnblogs.com/SharkBin/archive/2012/08/08/2627912.html
ps:触发器是一种特殊的存储过程。
参考:http://www.cnblogs.com/benshan/archive/2012/04/21/2462484.html
MySQL函数
mysql中delimiter的作用:http://www.cnblogs.com/rootq/archive/2009/05/27/1490523.html
MySQL实现sequence
DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
today VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
) ENGINE=InnoDB;
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL --说明语句部分是SQL语句
DETERMINISTIC --用于binlog和主从复制
CONTAINS SQL --子程序不包含读或写数据的语句 NO SQL/READS SQL DATA/MODIFIES SQL DATA
SQL SECURITY DEFINER --DEFINER就是以创建者的权限去检查,INVOKER是以执行者的权限去检查
COMMENT '' --注释
BEGIN
DECLARE value INTEGER;
SET value = 0;
SELECT current_value INTO value
FROM sequence
WHERE today = seq_name;
RETURN value;
END
$
DELIMITER ;
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = current_value + increment
WHERE today = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER ;
DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = value
WHERE today = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER ;
INSERT INTO sequence VALUES ((DATE_FORMAT(curdate(),'%Y%m%d')), 0, 1);
select nextval(DATE_FORMAT(curdate(),'%Y%m%d')) as autoIncrement;
select concat(today,right(10000+current_value,4)) as orderId from sequence;
/*或ON SCHEDULE AT '2016-07-22 12:00:00' + INTERVAL 1 DAY
每日凌晨触发*/
set global event_scheduler = 0;
CREATE EVENT setZero
ON SCHEDULE EVERY 1 DAY STARTS '2016-07-21 00:00:00'
ON COMPLETION PRESERVE ENABLE
DO
INSERT INTO sequence VALUES ((DATE_FORMAT(curdate(),'%Y%m%d')), 0, 1);
show events;
mysql事件
事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的。
使用这个功能之前必须确保event_scheduler已开启,查看当前是否已开启事件调度器。
SHOW VARIABLES LIKE 'event_scheduler';
或
SELECT @@event_scheduler;
或
SHOW PROCESSLIST;
开启:
SET GLOBAL event_scheduler = 1; /*或在配置my.ini文件 中加上 event_scheduler = 1*/
SET GLOBAL event_scheduler = ON; /*或在启动命令 mysqld ... --event_scheduler=1*/