我正在尝试运行以下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
?
根据我的阅读,此错误意味着您没有正确引用表名.一个常见的原因是该表是使用混合大小写拼写定义的,并且您尝试使用所有小写进行查询.
换句话说,以下失败:
CREATE TABLE "SF_Bands" ( ... ); SELECT * FROM sf_bands; -- ERROR!
使用双引号来分隔标识符,以便在定义表时使用特定的混合大小写拼写.
SELECT * FROM "SF_Bands";
重新评论,您可以向"search_path"添加一个模式,这样当您引用表名而不限定其模式时,查询将匹配该表名,方法是按顺序检查每个模式.就像PATH
在shell或include_path
PHP等中一样.您可以检查当前的架构搜索路径:
SHOW search_path "$user",public
您可以更改架构搜索路径:
SET search_path TO showfinder,public;
另见http://www.postgresql.org/docs/8.3/static/ddl-schemas.html
我有这个问题,这是故事(悲伤但真实):
如果您的表名全是小写,例如:您可以使用的帐户:select * from AcCounTs
它可以正常工作
如果您的表名全部小写如下:accounts
以下将失败:
select * from "AcCounTs"
如果您的表名称混合大小写如下:Accounts
以下将失败:
select * from accounts
如果您的表名称是混合大小写的情况:Accounts
以下将正常工作:
select * from "Accounts"
我不喜欢记住像这样无用的东西,但你必须;)
Postgres进程查询与其他RDMS不同.在您的表名之前将模式名称放在双引号中,例如"SCHEMA_NAME"."SF_Bands"
将dbname参数放在连接字符串中.一切都失败了,它对我有用.
另外,在进行选择时,请指定your_schema
.your_table
像这样:
select * from my_schema.your_table
我在OSX上遇到了类似的问题,但尝试使用双引号和单引号。对于您的情况,您可以尝试这样的事情
$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"