使用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

原理

未完待续