本期问答如下:
- MySQL的last_insert_id()如何替换?
- 如何对某个分区进行备份?
- 秒的精度格式如何指定?
- 函数支持out及returns同时使用吗?
Q1. MySQL的last_insert_id()函数在PG如何替换?
问题描述
在向数据库具有自增列的表中插入一行数据后,MySQL数据库可以通过last_insert_id()得到自增值,PG数据库有类似的函数吗?
问题解答
当我们使用PostgreSQL数据库时,RETURNING关键字的功能可以改变数据操作的行为。我们修改操作不仅可接收受影响的行数,还可获得数据行各列的值。更准确地说,RETURNING语法与SELECT语法获取指定列或列转换等功能类似。我们获得的值是数据操作执行触发后的新值。基于这个令人兴奋的功能,我们可以将之前工作流程简化为单个语句,该语句将执行数据更改并返回我们更改后的行。
示例如下:
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