暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

PostgreSQL问答-第20230227期

原创 Maleah 2023-02-27
2080

目录

Q1. xid类型与int类型运算符一致性问题

问题描述

PostgreSQL 9.6之前只支持xid类型与int类型的等值运算,9.6开始才完整支持=和<>运算符,在 9.6 版本之前有什么办法实现<>运算符呢?

问题解答

可以将xid类型的转换为int类型。

pg9.6之前只支持xid类型与int类型的等值运算,例如下面

select * from pg_class where relfrozenxid = 0 ;

但下面这个会报错

select * from pg_class where relfrozenxid <> 0 ;
ERROR: operator does not exist: xid <> integer
                    			    ^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

9.6开始完整支持=和<>的支持,下面的语句在9.6及以后的版本正常执行

select * from pg_class where relfrozenxid <> 0 ;

该语句通常用于查询表膨胀的问题,

如果为了向下兼容,我们也可以根据上面的报错HINT提示,使用两层类型转换来处理:如下:

select * from pg_class where relfrozenxid::text::int <> 0 ;

Q2. 如何查询各种不同类型的对象

问题描述

PostgreSQL 里面如何查询各种不同类型的对象呢?

问题解答

在 PostgreSQL 中,可以使用系统目录(system catalog)查询元数据信息,其中包括数据库中所有的表、视图、索引、存储过程、序列等对象的信息。

系统表/视图 对象
pg_class 包括数据库中所有的表、视图、索引、序列、TOAST表等对象的信息。
pg_namespace 命名空间
pg_tablespace 表空间
pg_database 数据库
pg_type 数据类型
pg_proc 存储过程、函数
pg_trigger 触发器

Q3. 普通用户禁用触发器失败

问题描述

PostgreSQL 14及之前版本普通用户禁用分区表触发器时报错无权限,有什么方法解决么?

问题解答

普通用户无法禁用触发器,15对这个问题进行了优化,15之前普通用户只能删除重建或用超级用户禁用

14以及之前版本:

postgres=> alter table test_p_t disable trigger test_ptt ;
ERROR:  permission denied: "test_ptt" is a system trigger

15版本:

postgres=> alter table test_p_t disable trigger test_ptt ;
ALTER TABLE

替代方案

  • 使用superuser禁用
  • 不用时drop trigger,需要使用时再次创建

Q4. copy导出header的注意事项

问题描述

PostgreSQL copy导出header的注意事项

问题解答

当使用copy导出的数据文件包含标题行时,导入也要添加指定 header

image-20230227155022207

Q5. 调用函数中的select into没有返回值时报错

问题描述

openGauss数据库里 select into语句会报错:ERROR: query returned no rows when process INTO
但在 PostgreSQL 里确是正常的,为什么呢?

问题解答

上面查询结果为空行时,在PostgreSQL 里默认返回空,不会报错。如果加strict必须要精确返回一行,空行会报错。在 openGauss数据库里, 为了兼容Oracle习惯,默认使用了strict属性,所以会报错。

测试用例:

create table test1(id int,info varchar);

CREATE OR REPLACE function public.test1()
returns varchar AS $function$
declare
   v_out varchar;
begin
    select info into v_out from test1 where id=10;
    return v_out;
end;
$function$
 LANGUAGE plpgsql;

select test1();

openGuass中:
image-20230227160702765

PostgreSQL 中:
image-20230227160938105

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

文章被以下合辑收录

评论