欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在MySQL中创建实现自增的序列(Sequence)的方法教程

程序员文章站 2023-11-03 09:06:22
由于我们业务的需要,我们以前数据的使用item_id [md5+time] 的生成方式太过冗余,我们考虑使用数字来表示,如果使用时间戳,可能会有重复的情况,我们觉得还不是那么的好,所以想到了利用一个...

由于我们业务的需要,我们以前数据的使用item_id [md5+time] 的生成方式太过冗余,我们考虑使用数字来表示,如果使用时间戳,可能会有重复的情况,我们觉得还不是那么的好,所以想到了利用一个独立的自增的sequence来解决该问题。由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能:

首先:

我们要创建--sequence 管理表

drop table if exists sequence; 
create table sequence ( 
     name varchar(30) not null,                   
     current_value int not null,  
     increment int not null default 1, 
     primary key (name) 
) engine=innodb; 

其次我们要创建几个函数用以实现对表的操作:

1 创建--取当前值的函数

drop function if exists currval; 
delimiter $ 
create function currval (seq_name varchar(30))            
     returns integer
     language sql 
     deterministic 
     contains sql 
     sql security definer 
     comment ''
begin
     declare value integer; 
     set value = 0; 
     select current_value into value 
          from sequence
          where name = seq_name; 
     return value; 
end
$ 
delimiter ;

2创建--取下一个值的函数

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 name = seq_name; 
     return currval(seq_name); 
end
$ 
delimiter ;

3创建--更新当前值的函数

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 name = seq_name; 
     return currval(seq_name); 
end
$ 
delimiter ; 
(注:关于delimiter;可以点击这里)

最后:

我们要用以下数据设置 创建的sequence名称 以及设置初始值和获取当前值和下一个值。

insert into sequence values ('item_id', 0, 1);   #插入一条数据,添加一个sequence名称和初始值,以及自增幅度
select setval('item_id', 10);                    #设置指定sequence的初始值
select currval('item_id');                       #查询指定sequence的当前值
select nextval('item_id');                       #查询指定sequence的下一个值
 

最最后 就是我们使用python 去调用

import pymysql

# 打开数据库连接(ip/数据库用户名/登录密码/数据库名)
db = pymysql.connect("localhost", "root", "xxxx", "xxxxx")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute()  方法执行 sql 查询
cursor.execute("select nextval('item_id');")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
db.commit()
print("database version : %s " % data)
print(type(data))                             #  这里返回的是一个tuple 类型  
num = list(data)[0]                           #  如果我们想需要 其他类型可以直接转换一下  或者l  ist 或者  str
print(num)
print(type(num))                              #  这里取了一个int类型

# 关闭数据库连接
db.close()