首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

更新/插入在postgres触发器函数中不起作用

在PostgreSQL中,触发器(Trigger)是一种特殊的函数,可以在数据库表上定义并与特定的数据库操作相关联。触发器可以在数据插入、更新或删除时自动执行特定的逻辑。然而,如果在PostgreSQL的触发器函数中尝试进行更新或插入操作,并不会起作用,这是因为在触发器函数执行期间,对同一张表进行的任何数据更改都不会立即生效。

这是由于PostgreSQL的工作原理所决定的。当触发器被激活时,它在一个事务中运行,并且该事务尚未提交。在同一事务中的其他语句(如UPDATE或INSERT)对该表的更改将暂时被挂起,直到触发器函数执行完成并事务被提交。因此,在触发器函数内部进行的更新或插入操作不会立即反映在表中。

为了解决这个问题,可以使用AFTER触发器和DEFERRED事务。AFTER触发器在数据修改完成后执行,而DEFERRED事务允许在触发器函数执行结束后才提交事务。

下面是一个示例,演示如何在触发器函数中进行更新或插入操作:

代码语言:txt
复制
-- 创建触发器函数
CREATE FUNCTION my_trigger_function() RETURNS TRIGGER AS $$
BEGIN
  -- 在触发器函数中进行更新或插入操作
  UPDATE my_table SET column1 = new.value WHERE id = new.id;
  RETURN new;
END;
$$ LANGUAGE plpgsql;

-- 创建触发器
CREATE TRIGGER my_trigger AFTER INSERT OR UPDATE ON my_table
FOR EACH ROW
EXECUTE PROCEDURE my_trigger_function();

-- 在DEFERRED事务中进行数据修改
START TRANSACTION DEFERRABLE;
INSERT INTO my_table (id, value) VALUES (1, 'new value');
COMMIT;

在上面的示例中,我们创建了一个触发器函数my_trigger_function,它在触发时会更新my_table表中的某些列。然后,我们创建了一个AFTER触发器my_trigger,它在每次插入或更新my_table的数据后执行触发器函数。

最后,我们使用DEFERRED事务来插入新的数据。这样,在提交事务之前,触发器函数中的更新操作将生效,并且在提交事务后对表进行查询时,更新的结果将被正确反映出来。

关于PostgreSQL触发器的更多信息,请参考腾讯云PostgreSQL文档:触发器

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

进阶数据库系列(十):PostgreSQL 视图与触发器

触发器的基视图上的条件不会被检查(一个级联检查选项将不会级联到一个 触发器更新的视图,并且任何直接定义一个触发器更新视图上的检查 选项将被忽略)。...emp_view2; DROP VIEW 可更新视图 如果一个视图满足以下条件,它就是自动可更新的: 该视图的 FROM 列表刚好只有一项,并且它必须是一个表或者另一个可更新视图。...视图的选择列表不能包含任何聚集、窗口函数或者集合返回函数。 一个更加复杂的不满足所有这些条件的视图默认是只读的:系统将不允许该视图上的插入更新或者删除。...可以通过该视图上创建一个 INSTEAD OF 触发器来获得可更新视图的效果,该触发器必须把该视图上的尝试的插入等转换成其他表上合适的动作。...pgAdmin操作 触发器的使用 创建一个account表,然后创建一个触发器,用于检测表account的列name的插入数据是否为空。

1K10

postgresql 触发器 简介(转)

可以系统表或系统视图上创建触发器吗? ---- 二、 以plpgsql语言为例, 讲解触发器函数. 触发器函数的返回值. 触发器函数的参数. 触发器函数的变量与传递....触发器函数的返回类型为trigger, 如果需要给触发器函数传入参数, 不能定义触发器函数的参数列表, 而是通过其他方式传入(TriggerData数据结构)....– 因为after for each row 的触发器函数NEW值(统一来自真正被影响的行数据) – 修改触发器函数 : postgres=# create or replace function...– 最终被更新的行数据则是最后一个update before for each row 触发器函数的返回值....注意各种触发器操作流的顺序, 返回值的传递, 返回值的意义. 2. 注意当1个表上有多个同类触发器时, 需要注意他们之间的参数传递, 触发顺序. 3.

3.9K20
  • zabbix5—agent2监控PostgreSQL

    PostgreSQL 安装 PostgreSQL 特征 函数:通过函数,可以在数据库服务器端执行指令程序。 索引:用户可以自定义索引方法,或使用内置的 B 树,哈希表与 GiST 索引。...触发器触发器是由SQL语句查询所触发的事件。如:一个INSERT语句可能触发一个检查数据完整性的触发器触发器通常由INSERT或UPDATE语句触发。...多版本并发控制:PostgreSQL使用多版本并发控制(MVCC,Multiversion concurrency control)系统进行并发控制,该系统向每个用户提供了一个数据库的"快照",用户事务内所作的每个修改...规则:规则(RULE)允许一个查询能被重写,通常用来实现对视图(VIEW)的操作,如插入(INSERT)、更新(UPDATE)、删除(DELETE)。...0.0.0.0/0 md5 #修改配置使能远程访问 vi /usr/local/pgsql/data/postgresql.conf #将注释去掉,修改如下图 #重启数据库,得postgres

    65710

    Citus 11 for Postgres 完全开源,可从任何节点查询(Citus 官方博客)

    出于性能原因,分片重新平衡功能也很有用,可以集群的所有节点之间平衡数据。...:分布式表上的触发器 触发器是一个重要的 Postgres 特性,用于维护复杂的数据模型——以及更广泛的关系数据库。...当插入更新或删除行时,触发器函数可以对数据库执行其他操作。由于所有 Citus 节点现在都有元数据,分布式表的分片上的触发器现在可以从存储分片的工作节点对其他分布式表执行操作。...Citus 的触发器方法可以很好地扩展,因为 Postgres 触发器调用被下推到每个分片。然而,Citus 目前无法知道触发器函数会做什么,这意味着它可以做一些导致事务问题的事情。...例如,如果触发器函数尝试访问其他分片,它可能看不到一些未提交的写入。避免这种情况的方法是仅从触发函数访问位于同一位置的分片键。

    1K20

    React useEffect中使用事件监听回调函数state不更新的问题

    很多React开发者都遇到过useEffect中使用事件监听回调函数获取到旧的state值的问题,也都知道如何去解决。...state值控制台打印结果如下图片手动实现的简易useEffect,事件监听回调函数也会有获取不到state最新值的问题下面根据上面React代码模拟为常规的js代码let obj; // 模拟btn...App纯函数组件每次state变化,React 函数会重新执行,所以我们可以进行如下模拟操作图片这个示例的运行过程就比较好理解,第一次执行App函数,初始化数据,Obj可以获取到函数内的a变量,因此,变量...React函数也是一样的情况,某一个对象的监听事件的回调函数,这个对象相当于全局作用域变量(或者与函数同一层作用域链),回调函数获取到的state值,为第一次运行时的内存的state值。...而组件函数内的普通函数,每次运行组件函数,普通函数与state的作用域链为同一层,所以会拿到最新的state值。

    10.8K60

    PostgreSQL数据库导入大量数据时如何优化

    的时候,我们某些时候会往库里插入大量数据,例如,导入测试数据,导入业务数据等等。...而且一个事务里完成所有插入的动作的最大的好处就是,如果有一条记录插入失败, 那么,到该点为止的所有已插入记录都将被回滚,这样就不会面对只有部分数据,数据不完整的问题。...已存在数据的表上创建索引要比递增地更新表的每一行记录要快。 如果你对现有表增加大量的数据,可以先删除索引,导入表的数据,然后重新创建索引。...六、关闭归档模式并降低 wal 日志级别 当使用 WAL 归档或流复制向一个安装录入大量数据时,导入数据结束时,执行一次新的 basebackup 比执行一次增量 WAL 更快。...九、禁用触发器 导入数据之前先 DISABLE 掉相关表上的触发器,导入完成后重新让他 ENABLE。

    1.4K20

    Postgres 10 开发者新特性

    由于Postgres的可靠性、节约成本、成熟,当然还有它的开源,已经21岁的Postgres开发者之中仍旧非常流行。 Postgres 10带来了一些新特性,其中一些特性另开发者感到十分兴奋。...10Clouds博客详细介绍了其中的一些特性。通过消除主表(master table)触发器(trigger)的需求,本地分区(native partitioning)现在变得更简单了。...这意味着创建分区表将变得更简单,并且从开发者的角度来看,现在从分区数据表中进行查询和插入非分区的数据表进行这些操作是完全一致的。...JSON列上的全文索引与其他列是类似的,因此我们的查询需要使用to_tsquery函数和to_tsvector函数的文本搜索的语法。...,这样操作会简化我们数据库的日常操作。

    1.9K20

    流式数据库PipelineDB之BF杂谈

    public | wiki_stream | foreign table | postgres 当从该表读取报错如下: postgres=# select * from wiki_stream...此时便引出流视图,可以达到"流和表的数据组合后作为输入并进行实时增量更新"的效果。 流数据一旦被流视图读取后就会被销毁,流数据不会存储在任何地方。...由于进行流转换过程数据不会被存储,因此流转换不支持聚合操作。...arguments 是一系列逗号分隔的参数,触发器执行时传给函数,只能为字符串常量。...随后对流插入数据,最后通过Bloom Filter查看Bloom包含的元素数量。 假设继续往里面插入数据,最后查出来的数据数量依旧是2,这种聚合将在去重角度非常有用。

    69330

    我被微服务坑掉了CTO职位

    但如果能使用 Supabase,我们可以直接跳过这些麻烦事、享受 Postgres 的强大功能。这样,我们就能直接在数据库处理其他更复杂的操作,例如涉及交易事务的产品更新。...而且 Supabase 还提供内部 hook 和 cron 作业,并全面支持 pg_cron、触发器、webhook 以及无服务器函数等。...例如,我们可以订单表上设置触发器,确保订单确认时立即向用户发送推送、短信或者电子邮件通知。我们可以使用触发器某些事件发生时延动怒出消息,例如创建用户账户或添加新产品。...之后,营销经理只需要向表内插入一个带有参数的新行——比如作为通知目标的用户。表上的触发器将自动调用无服务器函数以发出推送通知。...单从技术上讲,我们本可以用无服务器函数触发器来替代,但我还是选择用老办法。原因是我这人就这样,比较敏感守旧。

    90020

    如何在Ubuntu 16.04上安装PostgreSQL

    PostgreSQL支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。...同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。免费使用、修改、和分发 PostgreSQL,不管是私用、商用、还是学术研究使用。...更新您的系统: sudo apt-get update && sudo apt-get upgrade 注意 本教程是为非root用户编写的。需要提升权限的命令以sudo为前缀。...); 插入记录: INSERT INTO employees VALUES (1, 'John', 'Doe'); 查看“employees”表的内容: SELECT * FROM employees...PostgreSQL shell,输入以下内容以将employee表的所有权限授予用户examplerole: GRANT ALL ON employees TO examplerole; 输入\q

    2.2K20

    Postgresql快照堆栈ActiveSnapshot

    因为事务,有些行为是需要看到最新数据的,比如一个RR事务拿到一个快照后执行了一段时间,这时运行了一条CALL Func或触发器语句,开始进入函数的执行逻辑。...,执行结果为: postgres=# truncate t_plpgsql_transaction_20230406_01; TRUNCATE TABLE postgres=# call p_outter...(); NOTICE: count: {1,2} NOTICE: count: {1,2,10,20} 那么如果在函数p_outter执行pg_sleep期间内,另一个会话插入一条数据后会发生什么...代码CallStmt时判断procedure则拿新的快照,旧的入栈。 3 快照堆栈 实际上PGPushActiveSnapshot的用处非常多,例如创建索引、vacuum等等。...PG的快照和其他资源一样,生命周期也是严格跟随事务系统的,也就是事务提交、撤销、子事务提交、子事务撤销时,都会有快照的销毁或转移动作。

    1.1K60

    PG逻辑复制的REPLICA IDENTITY设置

    10版本之前,虽然没有内置的逻辑复制,也可以通过其它方式实现,例如触发器、自定义脚本实现表级别同步,另外也可以通过外部工具Londiste3实现。...逻辑复制原理,使用发布者/订阅者模型,使用订阅复制槽技术,可并行的传输WAL日志,通过订阅端回放WAL日志的逻辑条目,保持复制表的数据同步,注意这里不是“SQL”复制,而是复制SQL操作的结果。...发布可以选择将它们所产生的改变限制INSERT,UPDATE和DELETE的任意组合上,类似于触发器。默认情况下,复制所有操作类型。...逻辑复制目前仅支持数据库表逻辑复制,其它对象例如函数、视图不支持。 逻辑复制支持DML(UPDATE、INSERT、DELETE)操作,TRUNCATE 和 DDL 操作不支持。...创建表,插入正常,更新和删除,就会提示55000错误, CREATE TABLE temp_tb ( code varchar(32) COLLATE pg_catalog.default primary

    2.3K31

    我被微服务坑掉了CTO职位

    但如果能使用 Supabase,我们可以直接跳过这些麻烦事、享受 Postgres 的强大功能。这样,我们就能直接在数据库处理其他更复杂的操作,例如涉及交易事务的产品更新。...而且 Supabase 还提供内部 hook 和 cron 作业,并全面支持 pg_cron、触发器、webhook 以及无服务器函数等。  ...例如,我们可以订单表上设置触发器,确保订单确认时立即向用户发送推送、短信或者电子邮件通知。我们可以使用触发器某些事件发生时延动怒出消息,例如创建用户账户或添加新产品。...之后,营销经理只需要向表内插入一个带有参数的新行——比如作为通知目标的用户。表上的触发器将自动调用无服务器函数以发出推送通知。...单从技术上讲,我们本可以用无服务器函数触发器来替代,但我还是选择用老办法。原因是我这人就这样,比较敏感守旧。

    74930

    基于云上scf的定时任务设计方法

    1.1 COS触发器 用户配置了COS事件源后,用户在对应的COS的bucket或目录下上传或删除了文件操作,都会触发scf的函数运行。这里我们可以用于从COS中导入数据到Snova的应用场景。...3.3 用户授权 3.2章节,建议单独创建一个用户用于SCF的任务调度和计算。因此需要授权该用户访问对应数据库和表的权限。...数据库表授权 GRANT ALL on t1 to scf_visit; 四、定时调度任务 scf控制台创建函数。这里选择基于Python2.7语言实现函数。...实现功能,读取数据仓库postgres的t1表的数据。 其中user和password分别为3.3创建的用户和密码。Host和port为3.1章节的Snova外网访问地址。...5.3 创建函数函数的功能: 从COS外表读取数据,写入内表t1。 #!

    9.9K2012

    常用数据库 SQL 命令详解(下)

    函数是可以嵌入sql中使用的,可以select调用,而存储过程不行。...四、触发器 触发器是与表有关的数据库对象,满足定义条件时触发,并执行触发器定义的语句集合。...tigger_event详解: INSERT 型触发器插入某一行时激活触发器,可能通过INSERT、LOAD DATA、REPLACE 语句触发(LOAD DAT语句用于将一个文件装入到一个数据表,...示例,创建了一个名为trig1的触发器,一旦t_user表中有插入动作,就会自动往t_time表里插入当前时间。...五、序列 MySQL ,可以有如下几种途径实现唯一值: 自增序列 程序自定义 UUID() 函数 UUID_SHORT() 函数 5.1、自增序列 mysql,一般我们可以给某个主键字段设置为自增模式

    95220

    CMU 15-445 -- Embedded Database Logic - 12

    ---- User-Defined Functions (UDF) UDF 允许应用开发者 DB 自定义函数,根据返回值类型可以分为: Scalar Functions:返回单个数值 Table Functions..."change notification"通常可以与触发器(trigger)链接在一起,以便在发生变更时传递通知。 SQL标准,这种机制通常被称为"LISTEN + NOTIFY"。...[在这里插入图片描述!...如果一个视图满足以上两个条件,就被认为是可更新的。这意味着应用程序可以对该视图执行修改(插入更新、删除)操作,并且这些更改将应用到底层的基本表。...因此,当查询物化视图时,它会直接从磁盘获取数据,而不是每次执行查询时都重新计算结果。 自动更新:虽然物化视图存储了结果数据,但底层的基本表更新时可能导致物化视图的数据变得过时。

    25140

    用Keepalived实现PostgreSQL高可用

    工作TCP/IP参考模型的三层、四层、五层(物理层,链路层): 网络层(3):Keepalived通过ICMP协议向服务器集群的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包...或者SSH服务22端口,Keepalived一旦传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群剔除掉。...创建触发器函数,如下所示: CREATE FUNCTION cannt_delete () RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN RAISE...trigger_sr_delay_tru BEFORE TRUNCATE ON sr_delay FOR STATEMENT EXECUTE PROCEDURE cannt_delete() ; 插入数据...更新sr_delay表last_alive字段为当前探测时间。 [postgres@localhost scripts]$ cat /data/scripts/failover.sh #!

    2.8K12

    如何在PostgreSQL更新大表

    本文来源:www.codacy.com/blog/how-to… Postgres更新大型表并不像看起来那样简单。如果您的表包含数亿行,您将发现很难及时进行简单的操作,例如添加列或更改列类型。...一般准则 当您更新的值时,Postgres将在磁盘写入一个新行,弃用旧行,然后继续更新所有索引。此过程等同于INSERT加上每一行后再DELETE,这会占用大量资源。...如果可能,应在更新运行时删除所有索引,触发器和外键,并在最后重新创建它们。 添加没有默认值的可空列是一种廉价的操作。写入列的实际数据是昂贵的部分。...更新行时,不会重写存储TOAST的数据 从Postgres 9.2开始,某些数据类型之间进行转换不需要重写整个表。例如:从VARCHAR(32)转换为VARCHAR(64)。...如果可以安全地删除现有表,并且有足够的磁盘空间,则执行更新的最简单方法是将数据插入到新表,然后对其进行重命名。

    4.7K10

    独家 | 机器学习模型应用方法综述

    大多数情况下,为了更有效地获取数据,需要相似的数据存储类型。 触发器触发器是引导进程启动的事件,它们可以用于客户流失的预测。例如调用客户服务中心、检查订单历史记录的信息等。...Postgres允许将Python代码作为函数或称为PL/Python的存储过程来运行。...此外,还可以与Postgres触发器机制相结合来运行数据库,并更新客户流失分数。比如,如果在投诉表输入了一个新条目,那么让模型实时重新运行的话便很有价值。 ?...流程 流程以如下方式设置: 新事件: 当在投诉表插入新行时,将生成事件触发器触发器触发器功能将更新该客户客户配置文件表中提出的投诉数量,并为客户更新记录。...首先对本地存储进行初始请求,并检索客户配置文件的值及其存储的事件数组,检索完成后,向还原器函数提出请求,将这些值作为参数,还原器函数输出一个更新后的客户配置文件,并将本地事件合并到这个客户配置文件

    1.4K20
    领券