由于我们业务的需要,我我们以前数据的使用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()感谢大家