当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《不能简单地使用PostgreSQL表名("关系不存在")》经验,为你挑选了5个好方法。

我正在尝试运行以下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());

这会产生以下错误:

查询失败:错误:关系"sf_bands"不存在

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



1> Bill Karwin..:

根据我的阅读,此错误意味着您没有正确引用表名.一个常见的原因是该表是使用混合大小写拼写定义的,并且您尝试使用所有小写进行查询.

换句话说,以下失败:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

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

SELECT * FROM "SF_Bands";

重新评论,您可以向"search_path"添加一个模式,这样当您引用表名而不限定其模式时,查询将匹配该表名,方法是按顺序检查每个模式.就像PATH在shell或include_pathPHP等中一样.您可以检查当前的架构搜索路径:

SHOW search_path
  "$user",public

您可以更改架构搜索路径:

SET search_path TO showfinder,public;

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


看来,即使你输入`SELECT*FROM SF_Bands`,这仍然会失败,因为Postgres决定为你小写那个表名.奇怪的...
@romkyns:是的,这在RDBMS品牌中非常普遍,无限制的标识符被宣传为"不区分大小写".但是他们并没有真正区分大小写,因为他们实施的方式是强制小写.仅当您在定义表时允许表名小写时,才匹配表的名称.如果在CREATE TABLE时使用双引号分隔符,则在查询中引用分隔符时必须使用分隔符.

2> Mitzi..:

我有这个问题,这是故事(悲伤但真实):

    如果您的表名全是小写,例如:您可以使用的帐户:select * from AcCounTs它可以正常工作

    如果您的表名全部小写如下:accounts 以下将失败: select * from "AcCounTs"

    如果您的表名称混合大小写如下:Accounts 以下将失败: select * from accounts

    如果您的表名称是混合大小写的情况:Accounts 以下将正常工作: select * from "Accounts"

我不喜欢记住像这样无用的东西,但你必须;)


5.像`Accounts`这样的混合大小写将失败,来自Accounts的`select*;`我发现最奇怪的部分:同一个案例不相同.
所有这一切:postgres查询中的所有名称都是小写的,除非您使用引号.
感谢您安排所有互动!:)

3> Ugur Artun..:

Postgres进程查询与其他RDMS不同.在您的表名之前将模式名称放在双引号中,例如"SCHEMA_NAME"."SF_Bands"


你的回答是什么增加了之前接受的答案,22次投票并且有很多细节?

4> 小智..:

将dbname参数放在连接字符串中.一切都失败了,它对我有用.

另外,在进行选择时,请指定your_schema.your_table像这样:

select * from my_schema.your_table


非常感谢你!它确实可以帮助我解决问题!但是有办法我可以省略方案名称吗?

5> 小智..:

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

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

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有