我试图运行以下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?


当前回答

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

SELECT * from "Table_Name";

其他回答

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

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

如果你的表名都是小写的,比如:accounts 你可以使用:select * from AcCounTs,它会正常工作 如果你的表名都是小写的,比如:accounts 以下操作将失败: select * from "AcCounTs" 如果您的表名是混合大小写,如:Accounts 以下操作将失败: 从帐户中选择* 如果您的表名是混合大小写,如:Accounts 下面的操作就可以了: select * from "Accounts"

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

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

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

例如:

将Table_Name更改为Table_Name和 修改“ColumnName”为“ColumnName”

这真的很有帮助

SET search_path TO schema,public;

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

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

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