年ごとに別の 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. 日付/時刻フォーマットのテンプレート パターン修飾子