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

2022-08-30 06:08:26

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

根据我所读到的内容,此错误意味着您没有正确引用表名。一个常见原因是该表是使用混合大小写拼写定义的,并且您尝试以全小写形式查询它。

换句话说,以下操作将失败:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

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

SELECT * FROM "SF_Bands";

关于注释,可以向“search_path”添加架构,以便在引用表名而不限定其架构时,查询将通过按顺序选中每个架构来匹配该表名。就像在shell或PHP中一样。您可以检查当前的架构搜索路径:PATHinclude_path

SHOW search_path
  "$user",public

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

SET search_path TO showfinder,public;

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


答案 2

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

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

  2. 如果您的表名全部为小写,例如:以下操作将失败:accountsselect * from "AcCounTs"

  3. 如果您的表名大小写混合,如 :以下操作将失败:Accountsselect * from accounts

  4. 如果您的表名是混合大小写,例如:以下工作正常:Accountsselect * from "Accounts"

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


推荐