6

トリガーとシーケンスを使用して自動インクリメント フィールド (SERIAL など) を作成しようとしています。フィールドでシーケンスまたはシリアル タイプのみを使用できることはわかっていますが、両方の方法 (トリガーとシーケンス) を使用してこれを解決する必要があります。

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();

この組み合わせを試してみましたが、うまくいきません。テーブル alimento には、整数 ID (トリガーとシーケンスによる自動インクリメント) と varchar 名の 2 つのフィールドしかありません。

なにか提案を ?

ありがとう

4

1 に答える 1

10

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

CREATE SEQUENCE AlimentosSequencia;

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

新しいレコードを挿入すると、次のようになります。

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

もう 1 つの可能性は、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');

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

于 2012-06-22T12:04:45.287 に答える