postgresql – 有序序列生成

前端之家收集整理的这篇文章主要介绍了postgresql – 有序序列生成前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法为表记录生成某种有序标识符?

假设我们有两个线程在进行查询

线程1:

begin;
insert into table1(id,value) values (nextval('table1_seq'),'hello');
commit;

线程2:

begin;
insert into table1(id,'world');
commit;

完全可能(取决于时间)外部观察者会看到(2,’世界’)记录出现在(1,’你好’)之前.

这很好,但是我想要一种方法获取自上次外部观察者检查它以来出现的’table1’中的所有记录.

那么,有没有办法按照插入的顺序获取记录?也许OID可以提供帮助?

不可以.由于数据库表中没有自然的行顺序,因此您需要使用的只是表中的值.

好吧,你可以在某种程度上滥用Postgres specific system columns cmin and ctid.

元组ID(ctid)包含文件块编号和行的块中的位置.所以这代表了磁盘上当前的物理排序.通常情况下,后来添加的ctid会更大.您的SELECT语句可能如下所示

SELECT *,ctid   -- save ctid from last row in last_ctid
FROM   tbl
WHERE  ctid > last_ctid
ORDER  BY ctid

ctid的数据类型为tid.示例:'(0,9)’:: tid

但是它作为长期标识符并不稳定,因为VACUUM或任何并发UPDATE或其他一些操作可以随时改变元组的物理位置.但是,在交易期间,它是稳定的.如果您只是插入而没有其他内容,它应该在本地工作以达到您的目的.

除了串行列,我还会添加一个带有默认now()的timestamp列…

我还会让列默认填充您的id列(serialIDENTITY列).这将在稍后阶段从序列中检索数字,而不是显式获取然后插入它,从而最小化(但不是消除)竞争条件的窗口 – 稍后将插入较低id的机会.详细说明:

> Auto increment table column

猜你在找的Postgre SQL相关文章