使用MySQL生成自增主键
目录
MySQL 的 auto increment 主键在多个 insert 语句执行时,无法通过 last_insert_key() 返回可靠的值。更好的方法是使用生成器生成一个主键值,再执行 insert,类似 Oracle 中的 sequence。
Flickr 的文章《Ticket Servers: Distributed Unique Primary Keys on the Cheap》给出一种实现方法。
表
创建一个数据表 tickets_64
CREATE TABLE `tickets_64` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `stub` char(1) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `stub` (`stub`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
获取序号
在一个事务中执行下面的 SQL 语句
REPLACE INTO tickets_64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();即可获得唯一的主键。
Flask中的应用
Flask 中需要使用 engine.connect.excute SQL 语句。
def get_new_64bit_ticket():
batch_id = None
engine = db.engine
connection = engine.connect()
trans = connection.begin()
try:
connection.execute("REPLACE INTO tickets_64 (stub) VALUES ('a');")
(batch_id,) = connection.execute('SELECT LAST_INSERT_ID() AS id').fetchone()
trans.commit()
except:
trans.rollback()
raise
return batch_id原理
未完待续
