PostgreSQL中search_path的设置

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

PostgreSQL中search_path的设置_第1张图片

图1 查看当前search_path

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

我们考虑这样两种情况:

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

PostgreSQL中search_path的设置_第2张图片

图2  情景1

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

PostgreSQL中search_path的设置_第3张图片
图3 添加新的模式到search_path

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

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

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

tPostgreSQL中search_path的设置_第4张图片

图4 情景2

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


图5 创建模式和表

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

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

PostgreSQL中search_path的设置_第5张图片

图6 结果差异

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


你可能感兴趣的:(PostgreSQL,Highgo,DB)