【问题标题】:PostgreSQL - Self updating serial fieldPostgreSQL - 自更新序列字段
【发布时间】:2014-05-29 09:10:24
【问题描述】:

我有一个包含 3 个字段的表,integer 类型的 seqtimestamp 类型的 tstamptext 类型的 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


【解决方案1】:

您不需要数字排序来实现您的目标:您可以使用 lag()lead() window functions 检测漏洞:

select *
from (
  select *,
    not (txt = (lag(txt) over (order by tstamp))) as hole_before,
    not (txt = (lead(txt) over (order by tstamp))) as hole_after
  from t
) t
where txt = 'B';

SQLFiddle

编辑:如果您的数据可以保存多个相等的tstamp 值(请注意,默认情况下,时间戳字段的精度没有明确限制),并且您希望获得恒定的顺序在它们之上,将serial 添加到您的表格中并在您的窗口函数中使用order by tstamp, id。没有它,对您的表的查询每次都可能返回不一致,f.ex:

第一个查询的结果可能是 第二个查询的结果可能是 2014-01-03 00:00:00 | 2014-01-03 00:00:00 |乙 2014-01-03 00:00:00 | B 2014-01-03 00:00:00 |一个

【讨论】:

  • 这正是我所期望的答案!一个我不知道的功能已经可以满足我的需要!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2021-02-12
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多