【发布时间】:2014-05-29 09:10:24
【问题描述】:
我有一个包含 3 个字段的表,integer 类型的 seq 和 timestamp 类型的 tstamp 和 text 类型的 txt。
示例:
seq | tstamp | txt
--------------------------------
1 | 2014-01-01 00:00:00 | A
2 | 2014-01-02 00:00:00 | B
3 | 2014-01-03 00:00:00 | C
我想做什么:
如果插入以下行时间戳 -> 2014-01-02 12:00:00,我想根据有序 tstamp 更新我的 seq 字段
我想要的结果:
seq | tstamp | txt
--------------------------------
1 | 2014-01-01 00:00:00 | A
2 | 2014-01-02 00:00:00 | B
3 | 2014-01-02 12:00:00 | A
4 | 2014-01-03 00:00:00 | C
我知道我可以捕获一个插入触发器并按照 tstamp 顺序更新 seq 字段,但是对于每天进行的百万次插入来说它看起来非常低效。
有更好的方法吗?就像...某种我不知道的自我更新序列类型...
我为什么需要这个?
我需要一个始终更新的序列字段,因为我想知道,如果我只搜索 txt 字段设置为 A 的记录,它们之间是否存在时间“漏洞”,或者它们在未过滤表中顺序关闭
示例:
SELECT * FROM table WHERE txt = 'A';
结果:
seq | tstamp | txt
--------------------------------
1 | 2014-01-01 00:00:00 | A
3 | 2014-01-02 12:00:00 | A
接收查询结果的应用程序只需将 seq 与先前的 seq (current seq != previous seq + 1) 进行检查,以检测结果之间的“漏洞”。这就是为什么只有 tstamp 是不够的
【问题讨论】:
-
你在serial type这里吗?
-
有更好的方法吗? 如果
seq的唯一作用是提供基于tstamp的数字排序:只需删除它(这是多余的) .您可以安全地根据tstamp对查询进行排序,或者在每个查询本身中计算seq的值。如果seq的角色还要提供一个主键:这是最坏的办法改变它。 -
@pozs:时间戳值在繁忙的系统上不一定是唯一的,因此检索时编号可能不一致
-
@a_horse_with_no_name 是的,这就是我写 if 的原因。另一个 if 可能是一致的排序,但这可以通过辅助字段(只有在两个或多个时间戳确实相等时才获取更新)更轻松、更轻松地实现。
-
我更新了帖子,更好地解释了我的问题......对不起,我第一手不清楚
标签: postgresql sorting auto-increment