• 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_trigger
    language plpgsql
    as $$
    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_create
    ON ddl_command_end
    WHEN 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 test
    set text = 'b'
  • 相关阅读:
    27. Remove Element
    26. Remove Duplicates from Sorted Array
    643. Maximum Average Subarray I
    674. Longest Continuous Increasing Subsequence
    1. Two Sum
    217. Contains Duplicate
    448. Find All Numbers Disappeared in an Array
    566. Reshape the Matrix
    628. Maximum Product of Three Numbers
    UVa 1349 Optimal Bus Route Design (最佳完美匹配)
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12014166.html
Copyright © 2020-2023  润新知