问答中心分类: PHP不能简单地使用 PostgreSQL 表名(“关系不存在”)
0
匿名用户 提问 21分钟 前

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

brian-brazil 回复 21分钟 前

您确定 sf_bands 表存在吗? showfinder.sf_bands 有效吗?

brian-brazil 回复 21分钟 前

showfinder.sf_bands 完美运行

brian-brazil 回复 21分钟 前

也许我应该注意我的数据库是从 MySQL 迁移的

brian-brazil 回复 21分钟 前

你可以试试 pg_query($dbconn, $query) 吗?隐式连接可能会导致难以调试的问题,不妨将其作为可能的问题消除。您还可以尝试 pg_dbname($dbconn) 以确保它确实连接到 showfinder 吗?

brian-brazil 回复 21分钟 前

+1 提到大写字母是问题所在。我花了一个小时试图弄清楚为什么我不能从 PostgreSQL 中的单个表中进行选择。多么可怕的程序。

brian-brazil 回复 21分钟 前

我删除了表名周围的双引号,它可以工作

16 Answers
0
Mitzi 回答 21分钟 前

我对此有疑问,这就是故事(可悲但真实):

  1. 如果您的表名都是小写的,例如:您可以使用的帐户:select * from AcCounTs它会正常工作
  2. 如果您的表名都是小写的,例如:accounts以下将失败:select * from "AcCounTs"
  3. 如果您的表名是混合大小写,例如:Accounts以下将失败:select * from accounts
  4. 如果您的表名是混合大小写,例如:Accounts以下将正常工作:select * from "Accounts"

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

Roland 回复 21分钟 前

与 where 子句中的列名相同

Roland 回复 21分钟 前

5. 混合大小写,例如Accounts, 将失败select * from Accounts;我发现最奇怪的部分:相同的情况并不相同。

Erndob 回复 21分钟 前

就是这样:postgres 查询中的所有名称都是小写的,除非你使用引号。

Muli 回复 21分钟 前

第四个选项对我有用,虽然我没有使用 PHP

GetHacked 回复 21分钟 前

感谢您布置所有互动! 🙂

0
Ugur Artun 回答 21分钟 前

Postgres 处理与其他 RDMS 不同的查询。将架构名称放在表名之前的双引号中,如下所示,“SCHEMA_NAME”。“SF_Bands”

Yaroslav 回复 21分钟 前

您的答案对先前接受的答案增加了什么,被投票了 22 次并且有很多细节?

0
JarosPL 回答 21分钟 前

将 dbname 参数放在连接字符串中。它对我有用,而其他一切都失败了。
同样在进行选择时,指定your_schema.your_table像这样:

select * from my_schema.your_table
JoeTidee 回复 21分钟 前

将模式名称(例如 my_schema.my_relation)放入查询中会有所帮助。

Charlotte 回复 21分钟 前

非常感谢!它真的可以帮助我解决问题!但是有没有办法可以省略方案名称?

0
savie 回答 21分钟 前

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

$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"
0
Steve Shipway 回答 21分钟 前

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

SELECT * from "Table_Name";