2016-05-30 9 views
0

おはよう誰もが、私は次のような場合について質問があります:postgresqlに一連の数字を挿入するためのトリガの作成方法。しかし、前に検証された挿入文は..?

私がトリガーと土地のコードを挿入しますが、行を挿入するとき、それは非常にうまく機能するときの機能を持っています。 しかし、式の問題で挿入ステートメントが実行されない場合、シーケンス関数は行を挿入する前に値を生成し、順序を失うことになります。

トリガーまたは関数を変更して、シーケンス関数に移動する前にINSERT式の前に私を検証し、それによってnumerationのジャンプを回避する方法があります。

副コード(トリガーと機能)と表の画像。

CODE: 

CREATE TRIGGER trigger_codigo_pech 
BEFORE INSERT ON independizacion 
FOR EACH ROW 
EXECUTE PROCEDURE codigo_pech(); 

CREATE OR REPLACE FUNCTION codigo_pech() 
RETURNS trigger 
AS $$ 

DECLARE 
incremento INTEGER; 
cod_inde text; 

BEGIN 
IF (NEW.cod_inde IS NULL OR NEW.cod_inde = '''') THEN 
incremento = nextval ('codigo_pech'); 
NEW.cod_inde = 'PECH' || '-' || incremento; 
END IF; 
RETURN NEW; 
END; 
$$ LANGUAGE 'plpgsql'; 

CAPTURE QUERY RESULT

あなたが見ることができるように、また、記数でジャンプを防ぐために、主キーにトリガを作るために必要であろう。

私はあなたの助けを願っています。あなたはincremento.cod_inde DEFERRABLEを作成し、初期状態が遅延することができますあなたの

+1

シーケンスが意図した、あるいは保証するものではありません、厳密に生産します連続番号。彼らは厳密に単調増加していることを保証します。コードを管理するための代替案を見つけてください。 – JimmyB

答えて

0

ありがとう:次に

ALTER TABLE incremento ALTER COLUMN cod_inde SET DEFAULT 0; 
ALTER TABLE incremento 
    ALTER CONSTRAINT incremento_cod_inde_key 
    DEFERRABLE INITIALLY DEFERRED; 

INSERTトリガの後でnextval('codigo_pech')を割り当てる:

CREATE OR REPLACE FUNCTION codigo_pech_after() RETURNS trigger AS $$ 
BEGIN 
    UPDATE incremento SET 
    cod_inde = 'PECH-' || (nextval('codigo_pech'))::text 
    WHERE id = NEW.id; -- replace id with your table's primary key 
END; 
$$ LANGUAGE plpgsql; 
+1

言語名は識別子であり、文字列ではありません。一重引用符で囲まないでください。 –

関連する問題