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