PostgreSQL中实现更新默认值(二)

今天我们用表继承+触发器的方案,来实现表中的更新默认值。这也许是PostgreSQL里最佳的解决方案。

一. 创建一张表,作为父表

create table basic_update(  t_update timestamp);

二. 创建一个函数,用作最后负责修改t_update使用

CREATE OR REPLACE FUNCTION update_modified_column()  RETURNS TRIGGER AS $$BEGIN  NEW.t_update = now();  RETURN NEW;END;$$language ‘plpgsql‘;

三. 创建一个函数,用来给继承了basic_update的表新增一个触发器,怼上第二步的函数

create function table_create()  returns event_triggerlanguage plpgsqlas $$DECLARE oid           INT;        table_name    VARCHAR;        parent_tables VARCHAR [];        is_update     BOOL;BEGIN  SELECT object_identity      INTO table_name FROM pg_event_trigger_ddl_commands();  SELECT objid      INTO oid FROM pg_event_trigger_ddl_commands();  SELECT get_parent_tables_by_oid(oid)      INTO parent_tables;  大专栏  PostgreSQL中实现更新默认值(二) SELECT parent_tables :: TEXT [] @> ‘{basic_update}‘ :: TEXT []      INTO is_update;  IF is_update  THEN    EXECUTE ‘CREATE TRIGGER tgr_auto_t_update‘            || ‘ BEFORE UPDATE ON  ‘            || table_name            || ‘ FOR EACH ROW EXECUTE PROCEDURE update_modified_column()‘;  END IF;END;

四. 创建一个建表时的触发器,接管创建表的时机,怼上第三步的函数

CREATE EVENT TRIGGER etgr_table_createON ddl_command_endWHEN TAG IN (‘CREATE TABLE‘)EXECUTE PROCEDURE table_create();

五. 所有操作已经完成,可以创建一个表测试了

create table test(  id        varchar default uuid_generate_v4() not null    constraint test_pkey    primary key,  text      varchar,  t_create  timestamp default now())  inherits (basic_update);
insert into test (text)values (‘a‘);
update testset text = ‘b‘

相关推荐