今天我们用表继承+触发器的方案,来实现表中的更新默认值。这也许是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'

PostgreSQL中实现更新默认值(二)的更多相关文章

  1. MySQL5.7中的sql_mode默认值

    简介 在正常项目开发过程中,如果MySQL版本从5.6升级到5.7版本.作为DBA在考虑数据库版本升级带来的影响时,一般会有几个注意点: sql_mode 默认值的改变 optimizer_switc ...

  2. struts2视频学习笔记 03-06(Struts 2配置文件无提示问题,Action配置中的各项默认值,各种转发类型)

    课时3 解决Struts 2配置文件无提示问题(eclipse):window→preference→XML→XML Catlog

  3. sqlserver中GUID的默认值设置

    sqlserver中GUID的默认值设置 YID uniqueidentifier not null default (NEWSEQUENTIALID()), //有序GUID(只能用于表设计的时候的 ...

  4. c++ 中bool 的默认值

    比如在Test.h中定义变量: _isFirst; //Test.h头文件 #ifndef __TEST_H__ #define __TEST_H__ class Test{ private: boo ...

  5. 弹窗中修改select默认值遇到的问题

    弹窗中修改select默认值无效 前提: 项目中遇到一个需求, 在一个弹窗中,有很多个select都是在打开弹窗的同时由js自动生成的(每次打开都自动重新生成一遍). 弹窗打开后,从每个select的 ...

  6. @RequestMapping中method的默认值是什么?

    @RequestMapping中method的默认值是什么? 没有默认值,如果不配置method, 则以任何请求形式 RequestMethod.GET, RequestMethod.POST, Re ...

  7. 解决vue更新默认值时出现的闪屏问题

    在Vue项目中,对于一个展示用户个人信息的页面.有以下需求,需要判断用户个人信息是否填充过,如果填充过,需要在页面中展示已填充项(未填充项不展示):如果未填充过,需要在页面中显示另外一种元素(提示用“ ...

  8. 创建数据库表时,如何设置mysql中时间的默认值

    应用场景: 1.在数据表中,要记录每条数据是什么时候创建的,不需要应用程序去特意记录,而由数据数据库获取当前时间自动记录创建时间: 2.在数据库中,要记录每条数据是什么时候修改的,不需要应用程序去特意 ...

  9. js中function参数默认值

    --在dreamweaver做网站时,函数定义是在一个*.js文件中,其中定义了一个func,有四个参数,function func(string1,url,flag,icon),然后在另一个asp中 ...

随机推荐

  1. Python Learning Day2

    练习:login功能 def login(): with open(r'C:\Users\liubin\desktop\user.txt','r') as f: res=f.read() flag=1 ...

  2. 用Pandas Dataframe支撑起多只金融产品股票的数据内部形态

    3. 如果同时拿一个板块股票的收市价和成交额 前一篇说到,用大盘指数,如恒生指数,上证,深证,这些重要的大盘指数来做Dataframe主键,那麽如果是同时拿一个板块股票的收市价和成交额,可以怎样操作呢 ...

  3. 记录 TypeError: render() got an unexpected keyword argument 'renderer' 错误

    在网上看到MXShop这个项目,适合Python, Django + drf 进阶的,其中遇到 TypeError: render() got an unexpected keyword argume ...

  4. (转载)Tomcat 报错 (The tomcat server configuration at /Servers/Tomcat v7.0 Server at localhost-config is mi)

    错误如图所示: 目前对于这个错误的原因尚不清楚,目前只知道如何解决这个错误,等到以后知道了原因之后再更改此文. 原因猜测: 之前你的eclipse关联的tomcat由于某种原因出现了信息丢失,需要重新 ...

  5. Python 重新加载模块

    每个Python文件中的import modulename只被加载一遍,如果在运行过程中,这个Module被更改了,即使在在interpretor中运行import 语句也没用. 可以使用import ...

  6. MySQL--数据导入

    参考:http://blog.csdn.net/jyb2014/article/details/39294879?locationNum=13 可导入大文件. source 导入总是失败.

  7. matlab中画一条折线时怎样显示出每个点折点的数值

    举个例子: num=[5,44,62,154,264,365,398,480,619,705,762,728,669,726,890,731,707,696,558,509,444];date=[1. ...

  8. Git&GitHub 基本使用

    如果是Windows用户需要自行去Git的官网下载Git工具 相信以您的聪明才知不需要一会就可以安装好Git工具了 博主这里是MacOS系统,本省就自带Git工具就不演示安装了 在完成一个简单的Git ...

  9. 为什么常用 Map<> map = new HashMap()

    在初学Java的时候,经常能看到教材上的写法,使用了接口Map来引用一个map,而不是它的具体实现,那么这样做的好处是什么呢? <Effective Java>第52条:通过接口引用对象 ...

  10. 同步nginx日志到s3 bulket

    1.此处用的是增量同步 #!/bin/bash rm -rf /var/log/nginx/access.log.*.* local_host="`hostname --i`" a ...