【问题标题】:postgres make a records chain in one tablepostgres 在一个表中创建一个记录链
【发布时间】:2016-10-25 19:11:41
【问题描述】:

我在 postgres 9.4 中有一个表,我需要执行以下操作:

当新插入的记录到来时,我需要找到具有给定参数的先前记录并将其'next_message'列值分配给新生成的记录。所以我希望每条记录都引用具有给定过滤器的下一条记录,例如“session_id”。因此,如果 session_id=5,所有 seesion_id=5 的记录都应该引用下一个。我创建了一个触发器来选择以前的记录并设置此字段。但这很糟糕,它不适用于高负载的数据库表。该怎么做?

这是我的触发器:

CREATE OR REPLACE FUNCTION "public"."messages_compute_next_message" ()  RETURNS trigger
  VOLATILE
AS $dbvis$
DECLARE previous_session_message integer;

BEGIN
/*NEW.next_message_id=NEW.id;*/
update message set next_message_id=NEW.id where id=(select max(c.id) from message c where c.session_id=NEW.session_id and c.id<>NEW.id);
RETURN NEW;
END
$dbvis$ LANGUAGE plpgsql

如果我过于频繁地发布记录,我会在 next_message_id 字段中获得许多空值。这是合乎逻辑的,否则我必须在每次插入时阻止整个表。如何在 postgres 中正确地做到这一点?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    我想说忘记next_message_id

    在我看来,您的触发器看起来是在一个会话中按id 排序的。

    所以如果你需要上一条消息为id42的消息,你可以用

    SELECT max(prev.id)
    FROM message prev JOIN message curr
         ON prev.session_id = curr.session_id
            AND prev.id < curr.id
    WHERE curr.id = 42;
    

    设置正确的索引将大大加快速度。

    我假设id 上已经有一个索引;也许第二个索引ON (session_id, id) 会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多