1

serialパターンに基づいてインクリメントする Postgres (9.0) のフィールドを宣言することは可能ですか?

例えば:

 Pattern: YYYY-XXXXX
 where YYYY is a year, and XXXXX increments from 00000 - 99999.

それとも、トリガーを使用する必要がありますか?

編集:私は、おそらくサーバーの日付に基づいて、年が自動的に決定されることを好みます。このXXXXX部分は毎年 00000 から始まり、00000 に「リセット」され、その後、年の部分が変更されると 99999 に再び増加します。

4

2 に答える 2

2

年ごとに別の ID を作成してSEQUENCE、各シーケンスが 1 年を追跡できるようにします。

この関数はすべてを行います: @Igor@Clodoaldo
からのコメントで改善されました。

CREATE OR REPLACE FUNCTION f_year_id(y text = to_char(now(), 'YYYY'))
  RETURNS text AS
$func$
BEGIN

LOOP
   BEGIN
      RETURN y ||'-'|| to_char(nextval('year_'|| y ||'_seq'), 'FM00000');

   EXCEPTION WHEN undefined_table THEN   -- error code 42P01
      EXECUTE 'CREATE SEQUENCE year_' || y || '_seq MINVALUE 0 START 0';
   END;
END LOOP;

END
$func$ LANGUAGE plpgsql VOLATILE;

電話:

SELECT f_year_id();

戻り値:

2013-00000

text基本的に、これは要求されたパターンの を返します。現在の年に合わせて自動的に調整されます。名前のシーケンスyear_<year>_seqがまだ存在しない場合は、自動的に作成され、nextval()再試行されます。

パラメータなしでオーバーロードされた関数を同時に持つことはできないことに注意してください(前の例のように)。

この関数をDEFAULTテーブル定義の値として使用します。

CREATE TABLE tbl (id text DEFAULT f_year_id(), ...)

または、選択した年の次の値を取得できます。

SELECT f_year_id('2012');

Postgres 9.1 でテスト済み。v9.0 または v9.2 でも同様に動作するはずです。

ここで何が起こっているのかを理解するには、マニュアルの次の章をお読みください。

CREATE FUNCTION
CREATE SEQUENCE
39.6.3. 単純なループ
39.5.4. 動的コマンドの実行
39.6.6. エラーのトラップ
付録 A. PostgreSQL エラー コード
表 9-22. 日付/時刻フォーマットのテンプレート パターン修飾子

于 2013-01-11T03:30:12.120 に答える
1

この値 (YYYY-XXXXX) を形成する関数を作成し、この関数を列のデフォルトとして設定できます。

詳細はこちら

于 2013-01-10T12:31:40.860 に答える