2016-07-27 3 views
0

取得するには:この単純なテーブルを作成した後recusive関数Postgresは、私は歴史に関連した最新のIDを取得するために、PostgreSQLの機能を使用したい、最新のID

CREATE TABLE "tbl_ids" (
"ID" oid, 
"Name" text, 
"newID" oid 
); 

を、私はどこ私の機能を起動するには考えています、そしてあなたが尋ねる前に:私は、COALESCE()について知っている - の機能が、私はつもりだあなたは見つけるだろうので、彼の将来に片方の親-ID、より多くを持っている....

CREATE FUNCTION get_lastes_id(ID oid, newID oid) RETURNS oid AS $$ 
BEGIN 
    IF new IS NOT NULL THEN 
    --USE old--  
    END 
    IF new IS NULL THEN 
    get_latest_id(new, "newID") 
    END 
END; 

私はそれを言うお奨めとにかく:私はPostgreSQLの関数では本当に新しいので、これが可能かどうかはわかりません。しかし、COALESCE()と仮定 - 機能も、それは私が推測するサーバー側-機能である必要がありexsists:/

+1

最初はoidsを使用すべきではありません。どのような問題を解決しようとしていますか?答えのための –

答えて

0

はまず、あなたが求めているものは明らかではありません。 oidはおそらくシステムライブラリ用に設計された内部型であるため、おそらくあなたが期待するように動作することを保証することができないので、おそらく使用するのに最適な型ではありません。

第二に、これはあなただけで、最新のを取得するために再帰を使用したい場合はお粗末な選択ツールであることを私には思えます。物事をうまく実行したい場合は、忘れてはならないアルゴリズムではなく、集合演算で考えてみてください。

あなたは、トリガー名の最新の(最大)OIDを取得し、その後に「NEWID」それを割り当てたい場合は、次のOIDとint型で動作します

CREATE OR REPLACE FUNCTION set_newID() RETURNS TRIGGER LANGUAGE PLPGSQL AS 
$$ 
DECLARE maxid oid; 
BEGIN 
    IF new."newID" IS NOT NULL THEN 
      RETURN new; -- do nothing 
    END IF; 
    SELECT max("ID") INTO maxid FROM tbl_ids WHERE "Name" = new."Name"; 
    new."newID" = maxid; 
    RETURN new; 
END;  
$$; 

を。ただし、トリガーによって変更された各行のdbから1行を選択する必要があります。たとえば、バルク挿入のパフォーマンスに問題があります。

ああ、はるかに良いあなたは、すべての識別子を引用する必要はありませんので、すべて小文字を使用します。

+0

THXは、私はこれ以上のOIDを使用することはありません:) をしかし、あなたは私の問題は明確ではないように思わ言ったように:私はCOALESCE()のような機能を必要とする - COALESCEと同じように動作機能(NEWID、ID): IF newID = NULL次にIDを使用します。 IF newID!= NULL次に、newIDとCOALESCE()を使用します。新しいIDをIDとして設定し、newIDをその行から再度使用します。 – user2823842

+0

あなたは木を横断しようとしていますか?またはグラフですか?トリガーで?どうして? –

+0

トリガーとしてではなく、最初のものですが、COALESCE()と同様の機能です。 IDは決して変更できないので、それは必要になる「歴史的溝」で終わるでしょう。これはサーバ側の関数になる場合、私は、私は、これは – user2823842

関連する問題