PostgreSQL中search_path的设置

本文介绍了PostgreSQL中search_path环境变量的作用及应用场景。通过两个具体案例说明了当表所在模式不在search_path中时会发生错误,以及如何通过调整search_path解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:瀚高PG实验室 (Highgo PG Lab)

PostgreSQL中有一个环境变量search_path,它是一个模式列表。search_path路径中的第一个模式被称为current schema。

图1 查看当前search_path

从图1的结果看出,PostgreSQL会首先在和当前用户的用户名相同的模式中查询,如果相关数据不在此模式中,则会继续在路径中的下一个模式中查询(上图中为public),以此类推。

我们考虑这样两种情况:

1、如果存在匹配的项,例如表名。但是该表所在的模式并不在search_path中,那么会产生错误。

图2  情景1

如图2所示,我们创建了模式myschema1,在该模式中创建了表tmptst并将数据插入该表。但在我们想要查询表tmptst时却发生了错误,这是因为myschema1模式不在search_path路径下。

图3 添加新的模式到search_path

在图3中,将myschema1模式加入search_path后,再次查询时就可看到之前插入的数据结果。

2、当我们创建一个新模式,而且没有将它添加到search_path中,但是该模式和登录数据库时的用户名相同时的情况。

我们使用用户名myuser2登录数据库,然后创建一个表sp,插入数据,并查询表sp中t这一列的值。因为创建表时未指定模式,所以该表将会在默认的模式下被创建,即public。图4展示了相关结果。

t

图4 情景2

然后创建一个和用户名相同的模式,在该模式下创建一张表。

图5 创建模式和表

向该表中插入数据,并检查myuser2.sp表中的数据。然后如果我们从表sp中查询数据,会有一个问题:

查询结果和图4所示的不同。

图6 结果差异

因为此时PostgreSQL根据search_path,先搜寻和登录数据库时的用户名相同(即我们创建的模式myuser2)的模式,所以返回的是myuser2.sp的信息。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值