有没有办法为表记录生成某种有序标识符?
假设我们有两个线程在进行查询:
线程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列(serial
或IDENTITY
列).这将在稍后阶段从序列中检索数字,而不是显式获取然后插入它,从而最小化(但不是消除)竞争条件的窗口 – 稍后将插入较低id的机会.详细说明: