我想为每一天创建唯一的订单号。理想情况下,例如,在PostgreSQL中,我可以创建一个序列并为这些唯一的数字读取它,因为回读既得到了新的数字又是原子的。然后在一天结束时,我会重置序列。
然而,在sqlite3中,我只看到整数字段类型的自动增量。所以说我设置了一个带有autoincrement字段的表,并插入一条记录来获取新的数字(这似乎是一种非常低效的方式,但无论如何......)当我去读取最大值时,谁是说另一个任务没有进入并插入另一个记录,从而导致我回读了一个未命中,我的头号太远了(并且是另一个任务读回来的副本。)
从概念上讲,我要求:
...我只是不知道如何用sqlite3做到这一点。谁能开导我?
答案 0 :(得分:1)
在SQLite中,自动增量字段旨在用作其记录的实际主键。 您应该将它作为订单表的ID。
如果您真的想要一个独立于相应表记录的原子计数器,请使用具有单个记录的表。 通过交易确保ACID:
BEGIN;
SELECT number FROM MyTable;
UPDATE MyTable SET number = ? + 1;
COMMIT;
答案 1 :(得分:0)
将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。