加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 有序序列生成

发布时间:2020-12-13 16:16:47 所属栏目:百科 来源:网络整理
导读:有没有办法为表记录生成某种有序标识符? 假设我们有两个线程在进行查询: 线程1: begin;insert into table1(id,value) values (nextval('table1_seq'),'hello');commit; 线程2: begin;insert into table1(id,'world');commit; 完全可能(取决于时间)外部观
有没有办法为表记录生成某种有序标识符?

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

线程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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读