1. org.postgresql.util.PSQLException: ERROR: cached plan must not change result type
产生原因
通过java程序,频繁执行DDL操作
解决
在db连接url里,添加参数 prepareThreshold=0,即可解决问题。
eg:
jdbc:postgresql://192.168.1.1:5432/xxx?prepareThreshold=0
具体讲解可参考官方文档:
https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters
2. pgsql数据大小写敏感
2.1 模糊查询
mysql 可以不区分大小写,但pgsql是对大小写敏感的
pgsql 可以使用 ilike 对数据进行模糊检索,此时,对数据是不区分大小写的
ilike 与 like在性能上是否有区别,目前还没找到相关文档准确说明
官方文档对ilike的解释:
官方文档对ilike的解释2.2 指定列查询忽略大小写
场景:用户管理->注册用户->输入用户名->用户名校验是否存在
不可能有一个用户叫 Bean,还可以注册一个叫 bean 的用户
但pgsql是区分大小写的,这个时候,就需要使用 lower()函数+序列
官方文档:
使用lower+序列可解决查询数据区分大小写问题从图中也可以知道,创建了一个lower()的序列,同时把数据全部转换为小写后,进行匹配查询的
示例:
创建序列
DROP INDEX IF EXISTS IDX_USER_NAME;
CREATE INDEX IDX_USER_NAME ON USER (LOWER(USER_NAME));
查询
SELECT ID,USER_NAME FROM USER WHERE LOWER(USER_NAME) = LOWER('Bean');
3 使用存储过程来添加字段并赋值(20190422)
使用存储过来添加字段&&赋值4.pgsql通过sql查询表字段信息
SELECT
TABLE_NAME,
COLUMN_NAME,
dtd_identifier AS COLUMN_ID,
DATA_TYPE,
character_maximum_length AS DATA_LENGTH,
is_nullable AS NULLABLE,
column_default AS DATA_DEFAULT,
NUMERIC_scale AS DATA_SCALE
FROM
information_schema. COLUMNS
WHERE
table_schema = 'public'
AND TABLE_NAME = '****';
在网上坑了好久,找到的好多都是 pg_tables,pg_attrdef,pg_catalog 等等组合起来查询,特别麻烦,还不好用
其实通过 information_schema.columns 就可以获取到这些信息了
5.pgsql [Err] ERROR: syntax error at or near "ORDER"
pgsql 在执行update时,先进行了排序操作,会报这个错
原sql:
update my_user set age = age + 1 ORDER BY age asc;
pgsql错误原因:order by 不允许用在update场景,可用于 SELECT 或 UNION, INTERSECT,EXCEPT 组合的计算结果
修改后的sql:
update my_user set age = age +1 where id in (
select id from my_user order by age desc
);
通过子查询,先排序把需要update的数据id拿到,再通过id来更新数据
一个有趣的设计,mysql与pgsql的反应刚好相反
pgsql 能正常执行的语句,在mysql里会出现这个错误
[Err] 1093 - You can't specify target table 'my_user' for update in FROM clause
mysql错误原因:在更新这个表和数据时又查询了它,而查询的数据又做了更新的条件
在对工程做数据库兼容的时候,得注意这个坑了
网友评论