首页 > 其他分享 >KingbaseES Returning 的用法

KingbaseES Returning 的用法

时间:2023-02-28 10:14:56浏览次数:53  
标签:返回 OLD users firstname RETURNING Returning UPDATE 用法 KingbaseES

概述

数据表更新时,如果需要对修改前后的数据进行记录或比较,需要返回更新前后的数据。KingbaseES 可以通过 UPDATE语句是否能直接返回影响的数据。

KingbaseES支持insert,delete,update的returning。

  • insert returning 返回的是新插入的值。
  • delete returning 返回的是被删除的值。
  • update returning 返回的是更新后的值,不能返回更新前的值。

RETURNING语法:

RETURNING * | output_expression [ [ AS ] output_name ] [, ...]

RETURNING用法

INSERT

INSERT中,可用于RETURNING的数据是插入的行。 这在琐碎的插入中并不是很有用,因为它只会重复客户端提供的数据。 但依赖于计算出的默认值时可以非常方便。例如,当使用 serial列来提供唯一标识符时, RETURNING可以返回分配给新行的ID:

CREATE TABLE users (firstname text, lastname text, id serial primary key);

INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING id;

除了返回特定的列外,也可以 returning rowid ,或者 returning ctid

UPDATE

UPDATE中,可用于RETURNING的数据是被修改行的新内容。 例如:

UPDATE users SET firstname = 'Joe1'
  WHERE firstname = 'Joe'
  RETURNING firstname;

DELETE

DELETE中,可用于RETURNING的数据是删除行的内容。例如:

DELETE FROM users 
  WHERE lastname = 'Cool'
  RETURNING *;

UPDATE 如何返回更新前的值

在DML触发器中,可以使用 RECORD类型NEW,存储INSERT或UPDATE操作产生的新的数据行,RECORD类型OLD 存储被UPDATE或DELETE操作修改或删除的旧的数据行。

为了 UPDATE RETURNING 返回 NEW 数据,同时返回OLD数据,可以使用关联OLD表,同时返回旧数据。

UPDATE users NEW SET firstname = OLD.firstname||'_A'
from users OLD
where OLD.ctid = NEW.ctid
  RETURNING NEW.firstname firstname_new, OLD.firstname firstname_old;
  
  
                                  QUERY PLAN
-------------------------------------------------------------------------------
 Update on users new  (cost=28.90..60.95 rows=840 width=112)
   ->  Hash Join  (cost=28.90..60.95 rows=840 width=112)
         Hash Cond: (new.ctid = old.ctid)
         ->  Seq Scan on users new  (cost=0.00..18.40 rows=840 width=42)
         ->  Hash  (cost=18.40..18.40 rows=840 width=38)
               ->  Seq Scan on users old  (cost=0.00..18.40 rows=840 width=38)

需要返回更新前的数据,添加了OLD表,所以COST增加了一次Seq Scan成本。

标签:返回,OLD,users,firstname,RETURNING,Returning,UPDATE,用法,KingbaseES
From: https://www.cnblogs.com/kingbase/p/17126993.html

相关文章

  • Lazy用法
    publicclassStudentInfo{publicstaticStudentInfostudentLazy=newLazy<StudentInfo>(()=>newStudentInfo()).Value;publicintSt......
  • KingbaseES V8R6 集群运维案例 -- 归档失败导致 Switchover 失败
    案例说明:KingbaseESV8R6集群,备库在执行‘repmgrstandbyswitchover’时,切换失败,出现以下故障:经检查发现是主库归档配置错误,主库出现归档失败导致。适用版本:Kingbas......
  • KingbaseES libstdc++.so.6 version 'CXXABI_1.3.8'问题处理
    概述initdb报错如下:“ERROR:libstdc++.so.6:version:'CXXABI_1.3.8'notfound(requiredby...)”此文是以CentOSLinux7(AltArch)操作系统为例,编译安装高版本GC......
  • KingbaseES V8R6 集群环境备库不结束旧事务快照将影响主库的vacuum操作
    前言昨天同事遇到了一个有关vacuum的典型问题。V8R6读写分离集群环境,一主多备。版本:kingbaseesv008r006c004问题现象:主库日常巡检发现日志大量记录:waring:oldestxmi......
  • 连接Windows 平台 KingbaseES异常
    概述应用连接Windows平台的KingbaseES数据库,报错“com.kingbase8.util.KSQLException:致命错误:用户"system"Password认证失败(kbjdbc:autodetectedserver-encoding......
  • KingbaseES V8R6 备份恢复案例 -- 自定义表空间指定目录恢复
    ​案例说明:KingbaseESV8R6在通过sys_rman执行物理备份恢复时,可以通过参数‘--kb1-path’,指定恢复的数据(data)目录,但如果原备份中包含自定义表空间时,需要建立表空间映射,再......
  • KingbaseES checkpoint_timeout参数对wal日志量的影响
    前言在KingbaseESV8R6数据库中,必须先将更改写入WAL日志(老版本称为xlog),然后才能将这些更改从内存shared_buffer写入到磁盘。前两天有个同事遇到一个问题,wal日志每天生成......
  • lsof命令用法
    一、lsof命令介绍lsof(listopenfiles)命令可以列出当前系统已经打开的所有文件。在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访......
  • Python中logging模块用法
    一、低配logging日志总共分为以下五个级别,这个五个级别自下而上进行匹配debug-->info-->warning-->error-->critical,默认最低级别为warning级别。1.v1importlogging......
  • sys.argv的用法
    一、Pythonsys模块“sys”是“system”,是一个系统模块,该模块提供了一些接口,用户访问python解释器自身使用和维护的变量,同时模块中还提供了一些函数,而我们今天要讲解的......