2016-10-25 7 views
0

を記録チェーンを作る:Postgresは、私はpostgresの9.4でテーブルを持っていると私は次の操作を実行する必要がある1つのテーブルに

新しい挿入されたレコードが来るとき、私は与えられたパラメータを持つ前のレコードを検索し、それがNEXT_MESSAGEです割り当てる必要があります'列の値を新しく生成されたレコードに追加します。ですから、私は、各レコードが与えられたフィルタを使って次のレコードへの参照を持っていることを望みます。たとえば 'session_id'です。したがって、session_id = 5の場合、seesion_id = 5のすべてのレコードは、次のレコードを参照する必要があります。以前のレコードを選択してこのフィールドを設定するトリガーを作成しました。しかし、それは悪いですし、高度に読み込まれたdbテーブルでは動作しません。どうやってするか?私のトリガーだ

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分野で多くのNULL値を取得します。論理的です。それ以外の場合は、すべてのインサートのテーブル全体をブロックする必要があります。どのようにポストグルでそれを正しく行うには?

答えて

1

私はnext_message_idを忘れています。

トリガーがどのように見えるかは、メッセージが1セッション内でidで注文されたようです。あなたはid 42とのメッセージの前のメッセージを必要とする場合

だから、あなたはかなりこれをスピードアップします右のインデックスを設定する

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にあると仮定します。おそらく2番目のインデックスON (session_id, id)が役に立ちます。

+0

ありがとうございました!それは助けになった! – avalon

関連する問題