KingbaseES Returning 的用法

KingbaseES支持在INSERT,DELETE,UPDATE语句中使用RETURNING,以获取操作后的影响数据。UPDATE的RETURNING返回更新后的值,若需返回更新前的值,可通过DML触发器结合OLD和NEW记录类型实现。这在跟踪数据变化或需要比较更新前后状态时非常有用。
摘要由CSDN通过智能技术生成

概述

数据表更新时,如果需要对修改前后的数据进行记录或比较,需要返回更新前后的数据。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成本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值