暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

PostgreSQL问答-20230402

原创 多米爸比 2023-04-02
934

本期问答如下:

  • MySQL的last_insert_id()如何替换?
  • 如何对某个分区进行备份?
  • 秒的精度格式如何指定?
  • 函数支持out及returns同时使用吗?

Q1. MySQL的last_insert_id()函数在PG如何替换?

问题描述

在向数据库具有自增列的表中插入一行数据后,MySQL数据库可以通过last_insert_id()得到自增值,PG数据库有类似的函数吗?

问题解答

当我们使用PostgreSQL数据库时,RETURNING关键字的功能可以改变数据操作的行为。我们修改操作不仅可接收受影响的行数,还可获得数据行各列的值。更准确地说,RETURNING语法与SELECT语法获取指定列或列转换等功能类似。我们获得的值是数据操作执行触发后的新值。基于这个令人兴奋的功能,我们可以将之前工作流程简化为单个语句,该语句将执行数据更改并返回我们更改后的行。

参考:[译] CUD操作一次性返回行

示例如下:

postgres=# create table tab(id serial,data varchar);
CREATE TABLE

postgres=# insert into tab(data) values('hello chatgpt') returning id;
 id 
----
  1
(1 row)

INSERT 0 1

同时在JDBC的Statement里,还可以打开autoGeneratedKeys参数,insert或者upsert场景可以使用如下方式获取自增列值。

statement.executeUpdate(sql,autoGeneratedKeys);

Q2. PG或openGauss数据库如何对某个分区进行备份?

问题描述

分区表的某个分区是否可以通过dump的选项进行指定备份呢?

问题解答

在PG数据库里,使用pg_dump对分区表有两种备份方式,一种是直接使用-t 分区进行备份:

pg_dump -t 分区1 -t 分区2 …

这种方式将直接以分区的名称导出,还有另外一种方式是以父表名称导出,需要增加–load-via-partition-root参数,示例如下:

pg_dump --load-via-partition-root -t 分区1 -t 分区2 …

在openGauss数据库里,gs_dump不能使用-t导出某个分区,可以使用copy的方式进行备份,示例如下:

\copy (select * from tab partition (p1) ) to p1.dat 

Q3. 秒的精度格式

问题描述

针对输入的日期时间字符串,秒的精度格式处理上,PG与openGauss在下面的语句上存在差异:

to_timestamp('20230402 18:27:12.142532 +08:00',
'yyyymmdd hh24:mi:ss.ff6 TZH:TZM')

问题解答

PG从13开始支持FF1-FF6时间格式,最大支持到FF6微秒,在PG数据库,秒的精度需要明确指定,示例如下:

postgres=# select to_timestamp('20230402 18:27:12.142532 +08:00','yyyymmdd hh24:mi:ss.ff6 TZH:TZM');
         to_timestamp          
-------------------------------
 2023-04-02 18:27:12.142532+08
(1 row)

openGauss也支持FF时间精度的格式,最大支持到FF7,不过FF精度不必指定,数据库会自动识别,语句如下:

to_timestamp('20230402 18:27:12.142532 +08:00',
'yyyymmdd hh24:mi:ss.ff TZH:TZM')

Q4. PG函数里能同时支持out参数及returns返回值吗?

问题描述

PG11开始支持存储过程,存储过程一般可以使用out返回多个类型值,而函数通常使用returns返回单个类型,但函数里能同时使用out参数和returns吗?

问题解答

函数通常只使用returns进行返回,可以返回多行集合或者表对象,但out参数和returns也可以同时使用,示例如下:

create or replace function test_out_with_returns(in p1 varchar, out p2 varchar) 
returns varchar 
as $function$ 
declare
begin
    if p1 is null then
        return ;
    end if;
    p2 = p1;
end;
$function$ language plpgsql; 

但注意body里面不能同时使用return和out参数名,如果end前面加return p2,则会报错如下:

ERROR:  RETURN cannot have a parameter in function with OUT parameters
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论