sqlite3 autoincrement - 我错过了什么吗?

时间:2013-08-19 18:18:35

标签: sqlite sequence

我想为每一天创建唯一的订单号。理想情况下,例如,在PostgreSQL中,我可以创建一个序列并为这些唯一的数字读取它,因为回读既得到了新的数字又是原子的。然后在一天结束时,我会重置序列。

然而,在sqlite3中,我只看到整数字段类型的自动增量。所以说我设置了一个带有autoincrement字段的表,并插入一条记录来获取新的数字(这似乎是一种非常低效的方式,但无论如何......)当我去读取最大值时,谁是说另一个任务没有进入并插入另一个记录,从而导致我回读了一个未命中,我的头号太远了(并且是另一个任务读回来的副本。)

从概念上讲,我要求:

  • 等待其他任务的快速锁定
  • 增加数字
  • 检索号码
  • 解锁

...我只是不知道如何用sqlite3做到这一点。谁能开导我?

2 个答案:

答案 0 :(得分:1)

在SQLite中,自动增量字段旨在用作其记录的实际主键。 您应该将它作为订单表的ID。

如果您真的想要一个独立于相应表记录的原子计数器,请使用具有单个记录的表。 通过交易确保ACID:

BEGIN;
SELECT number FROM MyTable;
UPDATE MyTable SET number = ? + 1;
COMMIT;

答案 1 :(得分:0)

好吧,看起来像sqlite要么没有我需要的东西,要么我错过了它。这就是我想出的:

  • 将zorder声明为整数主键自动增量,订单表中的zuid整数

    这意味着每个新行都会以1

  • 开头的升序编号
  • 生成一个随机数:

    rnd = int(random.random()* 1000000)#unseeded python使用系统时间

  • 创建新订单(为简单起见只是SQL):

    'INSERT INTO orders(zuid)VALUES('+ str(rnd)+')'

  • 使用随机数找到确切的订单号:

    'SELECT zorder FROM orders WHERE zuid ='+ str(rnd)

  • 将该号码打包为新订单号(newordernum)

  • 删除随机数以降低碰撞风险

    '更新订单SET zuid = 0 WHERE zorder ='+ str(newordernum)

...现在我有了一个独特的新订单,我知道正确的订单号是什么,读取冲突的风险可以忽略不计,我可以准备这个订单,而不用担心我正在践踏另一个订单新创建的订单。

向您展示数据库作者实现序列的原因,lol。