2017-01-18 15 views
0

私はもちろん、ルートのエントリを指すレコードのルートIDを埋めるべきBEFOREトリガを持っています。エントリのparent_idがnullの場合は、それ自身を記録することを示します。もしBEFORE INSERTトリガーの中で、parent_idがnullの場合、AFTERトリガーでroot_idを埋めるのを避けるために、次のシーケンス値、fill ID、およびroot_idを取得できますか?独自の定義によるとPostgresの挿入トリガのIDは

+0

をシーケンスが来るんかここの写真に? – e4c5

答えて

0

エントリのPARENT_IDがnullの場合、それ自体が

を記録するために指すことになり、あなたがしなければならない。

if new.parent_id is null then 
    new.root_id = new.id ; 
else 
    WITH RECURSIVE p (parent_id, level) AS 
    (
    -- Base case 
    SELECT 
     parent_id, 0 as level 
    FROM 
     t 
    WHERE 
     t.id = new.id 
    UNION ALL 
    SELECT 
     t.parent_id, level + 1 
    FROM 
     t JOIN p ON t.id = p.parent_id 
    WHERE 
     t.parent_id IS NOT NULL 
) 
    SELECT 
    parent_id 
    INTO 
    new.root_id 
    FROM 
    p 
    ORDER BY 
    level DESC 
    LIMIT 
    1 ; 
end if ; 
RETURN new ; 
+0

私は、十分にストレスを感じなかった。私の質問は、これをすべてBEFOREトリガーで行う方法でした。 New.idはbefore-triggerで空です。それとも? – JohnSmith

+0

@JohnSmith:そうではありません。 'id'は' serial'(または 'bigserial'または' smallserial')ですか?もしそうなら、それはデフォルト値を持っているので、*は定義されています。 – joanolo

関連する問題