2013-08-19 77 views
0

我想为每一天创建唯一的订单号。因此,理想情况下,例如在PostgreSQL中,我可以创建一个序列并读取这些唯一的数字,因为回读都为我提供了新的数字,并且是原子的。然后在一天结束时,我会重置序列。sqlite3 autoincrement - 我错过了什么?

但是,在sqlite3中,我只看到整数字段类型的自动增量。所以说,我建立了一个带有自动增量字段的表格,并插入了一个记录来获得新的数字(似乎是一种非常低效的方法,但无论如何...)当我去阅读最大值后,谁是说另一个任务没有进入并插入另一个记录,从而导致我回读一个未命中,我的第一个太高级了(和另一个任务回读的副本)。

从概念上讲,我要求:

  • 快速锁定与等待其他任务
  • 增量数
  • 检索数
  • 解锁

......我只是不知道如何用sqlite3来做到这一点。任何人都可以启发我吗?

回答

1

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

如果您确实想拥有一个独立于相应表记录的原子计数器,请使用具有单个记录的表。 酸是确保了交易:

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

我不认为这回答了这个问题,否则我不理解它:假设我这样做,然后获取结果,但在得到结果之前,其他一些进程再次执行该操作?如何让我的计数器增量的结果在让任何其他进程再次递增之前给我提供多个增量的结果?请记住,这不是一个计数器,它是一个orderID;我必须得到一个唯一的号码,当我得到它时我必须知道它是什么。 – fyngyrz

+0

来详细说明:1)我增加2)其他进程增量3)我读取并获得双倍增量,4)其他进程读取并获得相同的双倍增量。看到问题了吗? – fyngyrz

+0

交易是[原子](http://www.sqlite.org/atomiccommit.html);当所有依赖语句都在一个事务中时,您不会发生冲突。 –

0

好吧,看起来像SQLite的要么没有我需要什么,或者我很想念它。以下是我想出了:

  • 声明ZORDER作为整数主键自动递增,南荷兰整数订单表

    这意味着每个新行的上升数字,从1开始

  • 产生一个随机数:

    rnd = int(随机。随机的()* 1000000)#种子选手Python使用系统时间

  • 创造新的秩序(只是SQL为简单起见):

    'INSERT INTO订单(老城)VALUES(' + STR(RND)+') '

  • 发现使用随机数,准确的顺序号:

    ' SELECT ZORDER FROM订单WHERE的Zuid =“+ STR(RND)

  • 包远离该号码作为新的顺序号(newordernum )

  • 撞随机数,以减少碰撞危险

    'UPDATE命令SET南荷兰= 0 WHERE ZORDER =' + STR(newordernum)

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

只是去告诉你为什么DB作者实现序列,哈哈。

+0

这不保证唯一性;冲突的可能性相当高(参见生日悖论),并且两个同时运行的Python脚本具有相同的系统时间值*会进一步提高概率。 –