Postgresql:is";公共的。”;在Postgresql中完全限定表名的标准方法?

Postgresql:is";公共的。”;在Postgresql中完全限定表名的标准方法?,postgresql,namespaces,Postgresql,Namespaces,如果我没有限定“public.”在account\u category表上,out account\u category将与account\u category表名称冲突 “public.”是否也适用于其他rdbms CREATE OR REPLACE FUNCTION X_RAIN(x VARCHAR, OUT user_id VARCHAR, out account_category varchar, out depth int) returns setof record AS $$ BE

如果我没有限定“public.”在account\u category表上,out account\u category将与account\u category表名称冲突

“public.”是否也适用于其他rdbms

CREATE OR REPLACE FUNCTION X_RAIN(x VARCHAR, OUT user_id VARCHAR, out account_category varchar, out depth int) returns setof record
AS 
$$
BEGIN
     return query 
     select uar.account_id, c.account_category, c.depth
     from account_with_types_chart_of_account uar
     inner join public.account_category c using(account_category_id);
END;
$$ LANGUAGE 'plpgsql';

Public是默认的架构名称

例如,在MySQL中,它没有模式(如果我记得的话)。此外,如果使用另一个模式而不是公共模式,代码将中断


我建议使用另一个变量名。可能还有另一种方法。

关于PostgreSQL中的public,当没有指定模式名称时,public被定义为默认模式名称。但是,这可以在search_path=xxx行的postgresql.conf文件中更改。要查看当前默认架构的设置,请发出以下SQL命令:

SHOW_ search_path;
SET search_path = new_path;
如果要在打开的查询会话中更改默认架构路径,请发出以下SQL命令:

SHOW_ search_path;
SET search_path = new_path;
但是,在您发布的示例中,我认为您遇到的命名冲突不是架构名称,而是函数参数名称帐户类别和表名帐户类别。可以重命名参数名称以避免此冲突。在具有许多模式的数据库中,为了澄清起见,我经常在数据库对象名称的开头显式指定public


关于第二个问题,我不认为PostgreSQL在使用public方面是独一无二的,但我知道许多其他数据库以不同的方式执行模式。

冲突的发生是因为您对变量和表名使用了相同的名称

这是一个非常糟糕的命名选择,可能会导致许多问题

例如:

create function x (somename TEXT) returns bool as $$
declare
  tempbool int4;
begin
  select true INTO tempbool from some_table where somename = somename;
  return tempbool;
end;
$$ language plpgsql;
这段代码基本上没有任何意义,因为解析器无法分辨“somename=somename”是什么意思。表名也是如此(在某种程度上)

通常,您希望标识符(表名、列名、变量名)是唯一的

我更喜欢在参数中使用“in_”前缀,但您对命名模式的选择可能会有所不同