【发布时间】: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