mysql 生成四位数_生成流水号,格式:日期+4位自增长,201607210001

本文介绍了如何在MySQL中模拟Oracle的sequence,通过存储过程和函数实现日期+4位自增长的流水号生成。详细步骤包括创建sequence表、定义currval、nextval和setval函数,并提供了示例操作,如插入初始值、获取流水号以及设置事件调度器每天重置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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';

0abd90768e6a979dd3b6ab6d29fb3712.png

SELECT @@event_scheduler;

14cd43ce1b3c077db7ff7d6585ae5e50.png

SHOW PROCESSLIST;

开启:

SET GLOBAL event_scheduler = 1;  /*或在配置my.ini文件 中加上 event_scheduler = 1*/

SET GLOBAL event_scheduler = ON; /*或在启动命令   mysqld ... --event_scheduler=1*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值