PostgreSQLのバージョンは、12.1で、Windows Server 2019で動かしています。
MySQLのON UPDATE CURRENT_TIMESTAMPと同様の動き(データをアップデートした日時を記録する)
をPostgreSQLでも実現させたく、ファンクションとトリガーを使って実現しようとしています。
以下のような仕組みを考えています。
・テーブルを作成
SQL
1CREATE TABLE aabbcc 2( 3 "id" integer DEFAULT nextval('aabbcc_id_seq'::regclass) NOT NULL, 4 "cd" character varying(9) NOT NULL, 5 "update_at" timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, 6 CONSTRAINT "aabbcc_pkey" PRIMARY KEY ("id") USING INDEX TABLESPACE "pg_default" 7) 8TABLESPACE "pg_default" 9;
・ファンクションを作成
SQL
1CREATE OR REPLACE FUNCTION fnc_update_at() 2 RETURNS trigger 3 LANGUAGE plpgsql 4AS $function$ 5 begin 6 new.update_at := 'now()'; 7 return new; 8 end; 9$function$ 10;
・トリガーを作成
SQL
1CREATE TRIGGER aabbcc_update_at 2BEFORE UPDATE 3ON aabbcc 4FOR EACH ROW 5EXECUTE PROCEDURE fnc_update_at() 6; 7
ファンクションの6行目が、「new.update_at := 'now()';」だとUPDATE時にupdate_atカラムが正しく更新されるのですが、
これだとトランザクションの開始日時になってしまうため、「new.update_at := 'statement_timestamp()';」
に変更して実行すると、データのアップデート時に以下のエラーになってしまいます。
ERROR:invalid input syntax for type timestamp with time zone:"statement_timestamp()"
now()もstatement_timestamp()も、戻り値の型はtimestamp with time zoneなので問題なく動くと
想定していましたが、エラーになってしまいました。
なぜエラーになってしまうのでしょうか?
回答3件
あなたの回答
tips
プレビュー