You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 9.6新手求助:如何移除查询中的pg_catalog约束?

移除PostgreSQL查询中的pg_catalog限定符

嘿,刚接触PostgreSQL 9.6的话,能写出这样的查询已经很棒了!关于移除pg_catalog约束这事儿,其实很简单,我给你一步步说清楚:

为什么会有pg_catalog?

pg_catalog是PostgreSQL的系统模式,内置的文本搜索配置(比如你用的russian)就放在这里。默认情况下,PostgreSQL的搜索路径已经包含了pg_catalog,所以大部分时候我们可以直接省略这个前缀。

具体修改步骤

1. 直接省略pg_catalog.前缀

如果你的数据库默认搜索路径没被修改过(这是绝大多数情况),直接把pg_catalog.russian改成russian就行。PostgreSQL会自动在系统模式里找到对应的文本搜索配置。

修改后的查询示例:

select * from (
    select "posts".* 
    from "posts" 
    inner join "feeds" on posts.destination_feed_ids # feeds.id > 0 and feeds.name='Posts' 
    inner join "users" on feeds.user_id=users.uid and not users.is_private 
    where to_tsvector('russian', posts.body) @@ to_tsquery('russian', 'xxx') 
union 
    select "posts".* 
    from "posts" 
    inner join "feeds" on posts.destination_feed_ids # feeds.id > 0 and feeds.name='Pos...'
) as combined_posts;

2. (可选)设置默认文本搜索配置

如果你的查询经常用到俄语文本搜索,可以把数据库的默认配置改成俄语,这样连russian参数都能省略:

-- 替换成你的数据库名称
ALTER DATABASE your_db_name SET default_text_search_config = 'pg_catalog.russian';

执行完后需要重新连接数据库生效,之后查询可以简化成:

where to_tsvector(posts.body) @@ to_tsquery('xxx')

注意事项

  • 如果之后你自己创建了同名的russian文本搜索配置(自定义的),PostgreSQL会优先使用自定义的,而不是系统内置的。如果想避免这种情况,要么给自定义配置起不同的名字,要么必要时还是保留pg_catalog.前缀。
  • 要是你的数据库被修改过搜索路径(移除了pg_catalog),省略前缀会报错。这时候可以用show search_path;查看当前搜索路径,若确实没有pg_catalog,可以用SET search_path TO pg_catalog, public;临时添加,或者修改数据库默认搜索路径。

内容的提问来源于stack exchange,提问作者Karlom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:41:18