是“公开”。在 PostgreSQL 中完全限定表名的标准方法?

问题描述 投票:0回答:3

如果我没有在

public.
表上限定
account_category
,则 out
account_category
将与
account_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';

postgresql namespaces
3个回答
5
投票

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

SHOW_ search_path;

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

SET search_path = new_path;

但是,在您发布的示例中,我相信您遇到的命名冲突不是模式名称,而是函数参数名称 account_category 和表名 account_category。您可以重命名参数名称以避免这种冲突。在具有许多模式的数据库中,为了清楚起见,我经常在数据库对象名称的开头显式指定 public。

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


2
投票

Public 是默认模式名称。

例如,在 MySQL 中它没有模式(如果我没记错的话)。 另外,如果您使用其他模式而不是公共模式,您的代码将会崩溃。

http://www.postgresql.org/docs/8.3/interactive/ddl-schemas.html

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


0
投票

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

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

例如:

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_”前缀作为参数,但您选择的命名模式可能会有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.