目录
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
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中:
PostgreSQL 中: