美文网首页
postgresql FAQ

postgresql FAQ

作者: 得鹿梦为鱼 | 来源:发表于2018-12-25 23:17 被阅读0次

    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错误原因:在更新这个表和数据时又查询了它,而查询的数据又做了更新的条件

    在对工程做数据库兼容的时候,得注意这个坑了

    相关文章

      网友评论

          本文标题:postgresql FAQ

          本文链接:https://www.haomeiwen.com/subject/vyzqlqtx.html