关于在mysql中产生流水号

原文:

  http://xm-koma.iteye.com/blog/1961793

  http://www.3lian.com/edu/2013/08-30/93449.html

MySql模拟Oracle的序列

第一步:创建--Sequence 管理表

DROP TABLE IF EXISTS ts_sequence;
CREATE TABLE ts_sequence (
sequence_name VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (sequence_name)
) ENGINE=InnoDB;

第二步:创建--取当前值的函数

DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE sequence_value INTEGER;
SET sequence_value = 0;
SELECT current_value INTO sequence_value
FROM ts_sequence
WHERE sequence_name = seq_name;
RETURN sequence_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

DECLARE temp_current INTEGER;
SET temp_current = currval(seq_name);

IF(temp_current = 9999)
THEN UPDATE ts_sequence
SET current_value = 1000
WHERE sequence_name = seq_name;
END IF;


UPDATE ts_sequence SET current_value = current_value + increment WHERE sequence_name = 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 ts_sequence
SET current_value = value
WHERE sequence_name = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER ;

第五步:测试函数功能

当上述四步完成后,可以用以下数据设置需要创建的sequence名称以及设置初始值和获取当前值和下一个值。

INSERT INTO ts_sequence VALUES ('tm_employee', 0, 1);----添加一个sequence名称和初始值,以及自增幅度
SELECT SETVAL('tm_employee', 10);---设置指定sequence的初始值
SELECT CURRVAL('tm_employee');--查询指定sequence的当前值
SELECT NEXTVAL('tm_employee');--查询指定sequence的下一个值

 

 

 

MySQL定时执行脚本(计划任务)实例

    查看event是否开启

  代码如下

show variables like '%sche%';

  将事件计划开启

  代码如下

set global event_scheduler =1;

  创建存储过程test

  代码如下

CREATE PROCEDURE test ()

BEGIN

update examinfo SET endtime = now() WHERE id = 14;

END;

  创建event e_test

  代码如下

create event if not exists e_test

on schedule every 30 second

on completion preserve

do call test();

  每隔30秒将执行存储过程test,将当前时间更新到examinfo表中id=14的记录的endtime字段中去.

  关闭事件任务

  代码如下

alter event e_test ON

COMPLETION PRESERVE DISABLE;

  开户事件任务

  代码如下

 alter event e_test ON

 COMPLETION PRESERVE ENABLE;

  以上测试均成功,测试环境为mysql 5.4.2-beta-community mysql community server(GPL)

  以上的相关内容就是对MySQL定时执行的介绍,望你能有所收获。

  mysql 计划任务重启后消失

  我们只要修改一配置即可

  event_scheduler在mysql的config中设置为OFF有关。去mysql中将配置改为ON则就搞定了。

 

posted @ 2015-03-27 20:26  Ellin  阅读(471)  评论(0编辑  收藏  举报