在MySQL中创建实现自增的序列(Sequence)的方法教程
程序员文章站
2022-06-03 09:45:25
由于我们业务的需要,我们以前数据的使用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()