不能简单地使用PostgreSQL表名(“关系不存在”)

我试图运行以下PHP脚本做一个简单的数据库查询:

$db_host = "localhost";
$db_name = "showfinder";
$username = "user";
$password = "password";
$dbconn = pg_connect("host=$db_host dbname=$db_name user=$username password=$password")
or die('Could not connect: ' . pg_last_error());


$query = 'SELECT * FROM sf_bands LIMIT 10';
$result = pg_query($query) or die('Query failed: ' . pg_last_error());

这会产生以下错误:

查询失败:ERROR:关系“sf_bands”不存在

在我能找到的所有例子中,有人得到一个错误,说明关系不存在,这是因为他们在表名中使用大写字母。我的表名没有大写字母。是否有一种方法可以查询我的表而不包括数据库名称,即showfinder.sf_bands?

677245 次浏览

从我所读到的,这个错误意味着您没有正确引用表名。一个常见的原因是,表定义为混合大小写拼写,并且您试图用所有小写字母查询它。

换句话说,以下是不成立的:

CREATE TABLE "SF_Bands" ( ... );


SELECT * FROM sf_bands;  -- ERROR!

使用双引号分隔标识符,以便在定义表时使用特定的混合大小写拼写。

SELECT * FROM "SF_Bands";

关于你的注释,你可以在“search_path”中添加一个模式,这样当你引用一个表名而不限定它的模式时,查询将通过按顺序检查每个模式来匹配该表名。就像shell中的PATH或PHP中的include_path,等等。您可以查看当前的模式搜索路径:

SHOW search_path
"$user",public

您可以更改模式搜索路径:

SET search_path TO showfinder,public;

另见http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

将dbname参数放在连接字符串中。当其他一切都失败时,它对我有用。

同样,在执行选择操作时,指定your_schemayour_table像这样:

select * from my_schema.your_table

Postgres处理查询与其他RDMS不同。将模式名放在表名前的双引号中,就像这样,“SCHEMA_NAME”。“SF_Bands”

我在这方面遇到了问题,这就是故事(悲伤但真实):

  1. 如果你的表名都是小写的,比如:accounts 你可以使用:select * from AcCounTs,它将正常工作

  2. 如果你的表名都是小写的,比如:accounts 以下操作将失败: 李select * from "AcCounTs" < / p > < / >

  3. 如果你的表名是混合大小写,例如 以下操作将失败: 李select * from accounts < / p > < / >

  4. 如果你的表名是混合大小写,例如 下面的操作就可以了: 李select * from "Accounts" < / p > < / >

我不喜欢记住这些没用的东西,但你必须记住;)

我在OSX上遇到了类似的问题,但尝试使用双引号和单引号。对于您的情况,您可以尝试这样做

$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"

对我来说,问题是,当Django初始化时,我对那个特定的表使用了查询。当然,它会抛出一个错误,因为这些表并不存在。在我的例子中,它是admin.py文件中的get_or_create方法,当软件运行任何类型的操作(在这种情况下是迁移)时执行。希望这能帮助到别人。

这真的很有帮助

SET search_path TO schema,public;

我深入研究了这个问题,发现了如何在当前数据库中为新用户默认设置这个“搜索路径”。

打开数据库属性,然后打开表“变量” 并简单地为您的用户添加该变量的实际值

现在您的用户将默认获得这个schema_name,您可以使用tableName而不使用schemaName。

必须用引号写模式名和表名。如下:

select * from "schemaName"."tableName";

你必须先添加模式。

SELECT * FROM place.user_place;

如果你不想在所有查询中添加这个,那么试试这个:

SET search_path TO place;

现在它将工作:

SELECT * FROM user_place;

最简单的解决方法是将表名和所有列名更改为小写字母,您的问题将得到解决。

例如:

  • Table_Name改为table_name
  • ColumnName更改为columnname

如果表名包含下划线或大写,则需要用双引号将其括起来。

SELECT * from "Table_Name";

我有同样的问题,如上所述,我使用PostgreSQL 10.5。

.我尝试了上面的所有方法,但似乎都不奏效

然后我关闭pgadmin并为PSQL终端打开一个会话。 登录PSQL,分别连接数据库和模式:

\c <DATABASE_NAME>;
set search_path to <SCHEMA_NAME>;

然后,重新启动pgadmin控制台,然后我就可以在pagadmin的查询工具中正常工作了。

这对一些人来说可能是愚蠢的,但在我的情况下-一旦我创建了表,我就可以在同一会话上查询表,但如果我重新登录新的会话table does not exits

然后我在创建表后使用commit,现在我也可以在新会话中找到和查询表。是这样的:

select * from my_schema.my_tbl;

希望这能帮助到一些人。

除了比尔Karwin answer =>

是的,你应该用double quotes包围表名。然而,请注意,php 不允许很可能只是简单地写:

$query = "SELECT * FROM "SF_Bands"";

相反,你应该使用single quotes,同时将查询包围为干腊肠说

$query = 'SELECT * FROM "SF_Bands"';

确保表名不包含任何尾随空格

enter image description here

我尝试了每一个好的答案(upvote >10)但行不通。

我在pgAdmin4中遇到了这个问题。

所以我的解决方案很简单:

  1. 找到目标表/方案。

  2. 鼠标右键单击,单击:query-tool

  3. 在这个新的查询工具窗口中,您可以在不指定set search_path to <SCHEMA_NAME>;的情况下运行SQL enter image description here < / p >

  4. 可以看到结果: enter image description here < / p >

试试这个:SCHEMA_NAME。TABLE_NAME

我建议检查是否运行了迁移,或者数据库中是否存在该表。