我三流

いろいろ自分なりにやってみたことを書いています

PostgreSQL トリガで自動採番

C#のDefaultValuesNeededで自動採番している部分を
PostgreSQLのトリガに置き換えてみました。
ロジックはDBで出来ることはDBにまかせたほうが
効率的ということは思っていたのですが
今日までこのトリガと向き合うことを避けてました。

下記、手続き型関数(トリガ)は
テーブル"sector"のカラム"n_id"が同じレコードのカラム"s_id"に
レコードが存在しない場合には、'1'を
レコードが存在する場合には、その最大値 +1を
値が入力される際にINSERTします。

CREATE OR REPLACE FUNCTION assign_id()
  RETURNS trigger AS
$BODY$
BEGIN
  PERFORM id FROM sector WHERE n_id = NEW.n_id;
    IF NOT FOUND THEN
      NEW.s_id := '1';
        RETURN NEW;
    ELSE
      SELECT COALESCE(MAX(s_id), 0) + 1 INTO NEW.s_id FROM sector WHERE n_id = NEW.n_id;
	RETURN NEW;
    END IF;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION assign_id() OWNER TO yu2admin;

まだまだ、トリガで置き換え出来るコードがあるので
トライしていきたいと思います。