社区首页 >问答首页 >postgresql -带有update的触发器函数不适用于初始插入

postgresql -带有update的触发器函数不适用于初始插入
EN

Stack Overflow用户
提问于 2017-02-03 16:15:13
回答 1查看 1.1K关注 0票数 0

我希望每次在表knowledgebase_messages上插入或更新记录时运行触发器,这将使用该消息的pg_language_dictionary的联接locale_id (例如:“message”)向量化法语列。

目前,触发器在行update上工作,但在initial上不起作用。这意味着,如果我插入一行,然后运行查询来获取记录,以任何方式更新该行,或者刷新postgres UI,我就会正确地看到矢量化值。

触发器功能:

代码语言:javascript
代码运行次数:0
复制
  runMessageVectorTriggerFn = 'CREATE OR REPLACE FUNCTION run_message_vector() ' +
    'RETURNS TRIGGER ' +
    'AS $BODY$ ' +
      'BEGIN ' +
        'IF pg_trigger_depth() <> 1 THEN ' +
           'RETURN NEW; ' +
        'END IF; ' +
        'UPDATE knowledgebase_messages kbm ' +
        'SET vector = to_tsvector(lang.pg_dictionary_name::regconfig, kbm.message) ' +
        'FROM locales as loca ' +
        'JOIN languages as lang ON loca.language_id = lang.id ' +
        'WHERE kbm.locale_id = loca.id;' +
        'RETURN NEW; ' +
      'END; ' +
    '$BODY$ LANGUAGE plpgsql';

触发器:

代码语言:javascript
代码运行次数:0
复制
  runMessageVectorTrigger = 'CREATE TRIGGER run_message_vector AFTER INSERT OR UPDATE ON knowledgebase_messages ' +
    'FOR EACH ROW EXECUTE PROCEDURE run_message_vector()';
EN

回答 1

Stack Overflow用户

发布于 2017-02-03 16:24:37

在BEFORE INSERT触发器中执行此操作时,它不会更新正在插入的行,因为该行尚不存在:

代码语言:javascript
代码运行次数:0
复制
UPDATE knowledgebase_messages kbm...

此外,还不清楚更新的目的是什么,因为WHERE子句似乎忽略了NEW行,就好像它隐含地表明它是目标一样。

无论如何,要更改正在插入/更新的行,请执行以下操作:

代码语言:javascript
代码运行次数:0
复制
-- the SELECT must return 1 row, or in the worst case no row
-- otherwise an error will occur.
NEW.vector = (
  SELECT
    to_tsvector(lang.pg_dictionary_name::regconfig, NEW.message)
  FROM locales as loca JOIN languages as lang
    ON loca.language_id = lang.id 
  WHERE NEW.locale_id = loca.id
);

RETURN NEW;

在UPDATE之前和INSERT之前的情况下。

然后,您可以删除此IF pg_trigger_depth() <> 1...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42028506

复制
相关文章
PostGreSQL ON DUPLICATE KEY UPDATE
在关系数据库中,术语 upsert 被称为合并(merge)。意思是,当执行 INSERT 操作时,如果数据表中不存在对应的记录,PostgreSQL 执行插入操作;如果数据表中存在对应的记录,则执行更新操作。这就是为什么将其称为 upsert(update or insert)的原因。
小石头
2023/03/24
4.3K0
触发器的初始值
复位或者置位的作用是将触发器设定到给定的状态即输出为0或1。如果只是上电复位或置位,那么这个复位或置位操作是没有必要的。这是因为对于初始值,可直接在RTL代码中写入。从仿真角度而言,这也避免了仿真起始阶段输出为未知状态。事实上,去除不必要的复位也是减少全局复位扇出过大的一个方法。例如,数据路径上的流水寄存器的复位是可以去除的,但控制路径上寄存器的复位是否可以去除则要根据系统功能需求加以辨别。
Lauren的FPGA
2019/10/31
1.6K0
postgresql 触发器 简介(转)
– 把before for each row的触发器删掉, 再测试插入 : postgres=# drop trigger tg02 on t_ret; DROP TRIGGER postgres=# drop trigger tg2 on t_ret; DROP TRIGGER postgres=# insert into t_ret values(1,’digoal’,now()); NOTICE: 00000: tg01 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg1 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg03, after for each row 的触发器函数返回空, 不影响后续的触发器是否被调用. 因为只要表上面发生了真正的行操作, after for each row就会被触发, 除非when条件不满足. (这个后面会讲到) LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg3 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg04 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg4 LOCATION: exec_stmt_raise, pl_exec.c:2840 INSERT 0 1 – 有数据插入. 这也说明了before for each statement的返回值为空并不会影响数据库对行的操作. 只有before for each row的返回值会影响数据库对行的操作. postgres=# select * from t_ret ; id | info | crt_time —-+——–+—————————- 1 | digoal | 2013-03-10 16:50:39.551481 (1 row)
qubianzhong
2019/07/01
4K0
POSTGRESQL UPDATE 操作 没那么容易
最近在 NC 呆了一段时间,公司的PG 使用量是蛮大的,库的使用量不小,单表的数据量在100多G的也比较多,数据库也都是上T 的规模。问题主要在数据量大,PG数据库使用的方式有一些问题,当然这个和业务逻辑因素以及数据库上下游的数据需求都有关。
AustinDatabases
2022/04/05
8440
POSTGRESQL  UPDATE  操作  没那么容易
PostgreSQL - update语句怎么关联多个表
对于select语句,我们可以通过join/outer join来关联多个表;但是对于update语句,是不能直接通过join/outer join来关联多表数据的,这里仅针对PostgreSQL。
雨临Lewis
2022/01/11
5.2K0
MySQL_插入更新 ON DUPLICATE KEY UPDATE
1、效率太差,每次执行都要执行2个sql 2、高并发的情况下数据会出问题,不能保证原子性
全栈程序员站长
2022/08/09
6420
POSTGRESQL PG VS SQL SERVER 到底哪家强? (译) 应该是目前最全面的比较
为什么翻译这篇文章,因为本人对于这两种数据库是在熟悉不过了,一个是有10多年的经验,一个也有5-6年的经验,而且这两种数据库在很多部分很相似,所以翻译了此篇。另外前两天有一个同学告知,他们单位SQL SERVER 被替换成 MYSQL ,OMG 这篇文字更的写,明明有 SQL SERVER 表兄弟 POSTGRESQL ,非要找 SQL SERVER 他二舅大伯三姨的儿媳妇 MYSQL 做替换的数据库,做这样决定的人,应该被开除。
AustinDatabases
2023/09/06
3K0
POSTGRESQL  PG  VS SQL SERVER 到底哪家强?  (译) 应该是目前最全面的比较
PCA不适用于时间序列分析的案例研究
在大部份情况下我们都可以使用 PCA 进行线性降维。从图像处理到非结构化数据,无时无刻不在。我们甚至可以将它用于时间序列分析,虽然有更好的技术。在这篇文章中,我想向您介绍动态模式分解 (DMD),这是一种源自我的研究领域:流体动力学的用于高维时间序列的线性降维技术。DMD 结合了两个世界中的优点:PCA 和傅立叶变换。在数学上,它与动力系统理论中的一个基本算子有关,称为 Koopman 算子。但在深入研究 DMD 的数学之前,让我们用一个相当简单的例子来说明为什么 PCA 不是高维时间序列分析的最佳选择。
deephub
2021/07/23
1.5K0
PCA不适用于时间序列分析的案例研究
Postgresql插入或更新操作upsert
幂等性的一个要求是多次操作的结果一致。对于update操作,多次直接的结果都是最后update的值,是满足需求的。但对于insert,如果已经插入,第二次会报错,duplicate error, 主键重复或者unique key duplicate。所以需要做一下处理。
Ryan-Miao
2019/01/24
2K0
数据库 PostgreSQL 常用命令
在我们开始学习 PostgreSQL 数据库前,让我们先了解下 ORDBMS 的一些术语:
为为为什么
2023/02/21
2.3K0
数据库 PostgreSQL 常用命令
函数与触发器
在mysql里支持很多的函数,函数就如java的方法一般,都会有一个返回值,函数帮助我们完成sql语句无法做到的事情,而且数据库是可以进行数据库编程的,所以也会有流程控制语句,不过一般来讲程序员不需要使用到那么复杂的函数组合和流程控制语句。那些都是DBA数据库管理员需要干的事情,程序员只需要了解掌握一些必须和经常使用的函数和控制语句即可。
端碗吹水
2022/01/12
8960
函数与触发器
数据库 PostgreSQL 常用命令
在我们开始学习 PostgreSQL 数据库前,让我们先了解下 ORDBMS 的一些术语:
为为为什么
2023/01/16
2.2K0
什么场景不适合箭头函数
这些年来,ES6 将 JS 的可用性提升到一个新的水平时: 箭头函数、类等等,这些都很棒。
前端小智@大迁世界
2020/05/26
8210
PostgreSQL MySQL 行版本管理 PK SQL SERVER timestamp 行版本管理
事情的发生时这样的,在很久很久以前,SQL SERVER 有一个字段类型叫timestamp, 对比其他数据库都没有的 row version 自动化管理的东西。这个东西厉害的地方,虽然看上去可能是一个时间字段,但实际上不是,只要你对SQL SERVER 表的任意一行进行变动,那你放心那个字段的值一定会自动变化,这样你就可以通过这个字段,在程序里面先将这行的 timestamp值取出来,然后根据业务逻辑,如果需要过段时间你再去这一行变化或曾经变化过吗?之间与现在的timestamp字段值进行比对,那妥妥的能告诉你,这行的数据任意字段是否变化过,有人说MYSQL也有timestamp ,那个字段是通过时间来update 只要这个行变动过就触发timestamp 更改时间就可以了,当然datetime也行,早期版本不行。
AustinDatabases
2020/02/25
1.4K0
PostgreSQL  MySQL 行版本管理 PK SQL SERVER timestamp 行版本管理
Postgresql select 语句 share VS update 用过吗?
Postgresql select 语句不够用吗, select for share ,select for udpate 这样的语句我从来没有用过,是不是多余。
AustinDatabases
2020/09/10
2.1K0
Postgresql  select 语句 share VS update  用过吗?
Postgresql源码(57)HOT更新为什么性能差距那么大?
这里的位图是什么参考这一篇:《Postgresql源码(52)bitmapset分析RelationGetIndexAttrBitmap》
mingjie
2022/06/30
5380
Postgresql源码(57)HOT更新为什么性能差距那么大?
PostgreSQL>窗口函数的用法
转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9311281.html
上帝
2018/08/03
1K0
PostgreSQL>窗口函数的用法
Postgresql源码(86)varchar的创建与插入分析
一般PG数据类型不会带括号,varchar和numeric是比较特殊的基本类型,后面可以带括号指定长度或精度。
mingjie
2022/10/28
5460
20.python update函数
在前一篇文章  python ChainMap  中我们介绍了关于python内置函数 ChainMap的使用,ChainMap函数和update函数类似,都是对字典操作,也是将多个字典合并,那么问题来了?ChainMap和update两者区别在哪呢?
猿说编程[Python和C]
2020/03/12
4760
JavaScript 函数中带有参数并返回值的函数
document.getElementById("demo").innerHTML=myFunction(4,3);
好派笔记
2021/09/18
5.7K0

相似问题

Postgresql -触发器函数插入带有引号(")的文本

12

用于插入的postgresql触发器

13

插入触发器和UPDATE()函数

21

插入带有触发器的多行: Postgresql

22

Rails update_attributes不适用于Postgresql

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文