pg 数据库中,如何从update 返回 :old .
pg 的update 语法里有returning 字句 .
但是是返回的 修改的值, 相当于 ,
update 后 接着执行了 同样条件的select 语法.
那么如何返回 修改前的值呢 ?
https://stackoverflow.com/questions/7923237/return-pre-update-column-values-using-sql-only-postgresql-version?tdsourcetag=s_pcqq_aiomsg
https://stackoverflow.com/questions/29256888/insert-into-from-select-returning-id-mappings/29263402#29263402
UPDATE tbl xSET tbl_id = 23 , name = 'New Guy'FROM tbl y -- using the FROM clauseWHERE x.tbl_id = y.tbl_id -- must be UNIQUE NOT NULLAND x.tbl_id = 3RETURNING y.tbl_id AS old_id, y.name AS old_name , x.tbl_id , x.name;
old_id | old_name | tbl_id | name--------+----------+--------+--------- 3 | Old Guy | 23 | New Guy
WITH sel AS (
SELECT tbl_id, name FROM tbl WHERE tbl_id = 3 -- assuming unique tbl_id ), upd AS ( UPDATE tbl SET name = 'New Guy' WHERE tbl_id = 3 RETURNING tbl_id, name )SELECT s.tbl_id AS old_id, s.name As old_name , u.tbl_id, u.nameFROM sel s, upd u;
UPDATE tbl xSET tbl_id = 24
, name = 'New Gal'FROM (SELECT tbl_id, name FROM tbl WHERE tbl_id = 4 FOR UPDATE) y
WHERE x.tbl_id = y.tbl_id
RETURNING y.tbl_id AS old_id, y.name AS old_name, x.tbl_id, x.name;
对于 insert 怎么办呢 ?
WITH sel AS ( SELECT id, title FROM posts WHERE id IN (1,2) -- select rows to copy ), ins AS ( INSERT INTO posts (title) SELECT title FROM sel RETURNING id, title )SELECT ins.id, sel.id AS from_idFROM insJOIN sel USING (title);
If
title
is not unique per query (but at least
id is unique per table):
WITH sel AS (
SELECT id, title, row_number() OVER (ORDER BY id) AS rn FROM posts WHERE id IN (1,2) -- select rows to copy
ORDER BY id ), ins AS (
INSERT INTO posts (title)
SELECT title FROM sel ORDER BY id -- ORDER redundant to be sure
RETURNING id )SELECT i.id, s.id AS from_idFROM (SELECT id, row_number() OVER (ORDER BY id) AS rn FROM ins) iJOIN sel s USING (rn);
This second query relies on the undocumented implementation detail that rows are inserted in the order provided. It works in all current versions of Postgres and is probably not going to break.
留着做参考吧 .
编辑推荐:
- PG 中返回update 前的值 :old03-14
- PostgreSQL DBA(123) - 列式存储zedstore再体验03-14
- Word2013中绘制斜线表头的方法03-14
- 在Word2013文档中插入时间和日期的方法03-14
- PostgreSQL DBA(124) - Develop(Putting multiple LIKE patterns into an array)03-14
- Word2013中通过文档检查器将审阅者设置为匿名的方法03-14
- PostgreSQL DBA(125) - PG 12(TPCC)03-14
- PostgreSQL DBA(126) - PG 12(搭建流复制)03-14
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- XLOG段文件跳号现象分析
XLOG段文件跳号现象分析
26-03-14 - PostgreSQL WAL解析:构建WAL记录准备
PostgreSQL WAL解析:构建WAL记录准备
26-03-14 - PostgreSQL 源码解读(226)- Linux Kernel(进程虚拟内存#1)
- PostgreSQL 12 正式发布:全面的性能提升
PostgreSQL 12 正式发布:全面的性能提升
26-03-14 - PostgreSQL DBA(91) - PG upgrade
PostgreSQL DBA(91) - PG upgrade
26-03-14 - PostgreSQL 源码解读(227)- Linux Kernel(进程虚拟内存#2)
- PostgreSQL扫描方法综述
PostgreSQL扫描方法综述
26-03-14 - 详述PostgreSQL的常见参数和技巧
详述PostgreSQL的常见参数和技巧
26-03-14 - PostgreSQL DBA(71) - Locks(Table-Level):What You Should Know
- PostgreSQL体系结构
PostgreSQL体系结构
26-03-14
