2012-06-20 10 views
5

トリガとシーケンスを使用して自動インクリメントフィールド(SERIALなど)を作成しようとしています。私は、フィールド上のシーケンスまたはSERIAL型を使用することができますが、私はこのトリガとシーケンスを含む自動インクリメントフィールドをPostgresに作成

CREATE SEQUENCE AlimentosSequencia; 

CREATE OR REPLACE FUNCTION AlimentoFuncion() 
    RETURNS "trigger" AS 
$BODY$ 
    BEGIN 
     New.id:=nextval('AlimentosSequencia'); 
     Return NEW; 
    END; 
$BODY$ 

LANGUAGE 'plpgsql' VOLATILE; 

CREATE TRIGGER AlimentosTrigger 
    BEFORE INSERT 
    ON alimento 
    FOR EACH ROW 
    EXECUTE PROCEDURE AlimentoFuncion(); 

が、私はこの組み合わせを試してみたがdosen't作品(トリガーやsecuences)の両方の方法を使用して解決しなければならないことを知って、テーブルalimentoには2つのフィールドがあり整数ID(トリガとシーケンスによる自動インクリメント)およびvarchar名を指定します。

提案がありますか?

おかげ

+5

「それは機能しません」という説明があります。 –

+2

シンプルなSERIALタイプを使用してみませんか? –

+3

他の目的のために、 'serial'カラムの関連するシーケンスで' nextval() 'を呼び出すことができます。トリガーで物事を複雑にする必要はありません。それを除いて、エラーメッセージなしで、あなたの質問はちょうどノイズです。それを逐語的に含めてください。 –

答えて

6

、他のユーザーがあなたに言ったように、あなたはトリガーを使用する必要はありません。あなたはこのようにテーブルを宣言することができます。

CREATE SEQUENCE AlimentosSequencia; 

CREATE TABLE alimento (
    id integer NOT NULL DEFAULT nextval('AlimentosSequencia') PRIMARY KEY 
,name VARCHAR(255)); 

をそして、あなたは新しいレコードを挿入する場合:

INSERT INTO alimento (name) VALUES ('lemon'); 

は別の可能性は、それが自動的にシーケンスを作成することを、serial typeとしてIDフィールドを宣言しています。

更新日: これは練習です。それから、私は何が問題なのか分かりません。私はこのコードをテストしました:

CREATE SEQUENCE AlimentosSequencia; 

CREATE TABLE alimento (
    id integer NOT NULL PRIMARY KEY 
,name VARCHAR(255)); 

CREATE OR REPLACE FUNCTION AlimentoFuncion() 
RETURNS "trigger" AS 
$BODY$ 
BEGIN 
    New.id:=nextval('AlimentosSequencia'); 
    Return NEW; 
END; 
$BODY$ 
LANGUAGE 'plpgsql' VOLATILE; 

CREATE TRIGGER AlimentosTrigger 
BEFORE INSERT 
ON alimento 
FOR EACH ROW 
EXECUTE PROCEDURE AlimentoFuncion(); 

INSERT INTO alimento (name) VALUES ('lemon'); 

そして問題なく動作します。

+0

素晴らしい!ありがとう!! – jgiunta

+0

問題は私がIDフィールドを宣言したときでした... :(!!!!しかし、あなたの答えを読んで、私は問題を検出しました。 – jgiunta

関連する問題