ChatGPT解决这个技术问题 Extra ChatGPT

Cannot simply use PostgreSQL table name ("relation does not exist")

I'm trying to run the following PHP script to do a simple database query:

$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());

This produces the following error:

Query failed: ERROR: relation "sf_bands" does not exist

In all the examples I can find where someone gets an error stating the relation does not exist, it's because they use uppercase letters in their table name. My table name does not have uppercase letters. Is there a way to query my table without including the database name, i.e. showfinder.sf_bands?

Are you sure that the sf_bands table exists? Does showfinder.sf_bands work?
showfinder.sf_bands works perfectly
Perhaps I should note that my database was migrated from MySQL
Can you try pg_query($dbconn, $query)? The implicit connection can cause hard-to-debug issues, may as well eliminate it as a possible problem. Can you also try pg_dbname($dbconn) to make sure it's indeed connected to showfinder?
+1 for mentioning that the uppercase letters are the problem. I spent an hour trying to figure out why I could not select from a single table in PostgreSQL. What a terrible program.

B
Bill Karwin

From what I've read, this error means that you're not referencing the table name correctly. One common reason is that the table is defined with a mixed-case spelling, and you're trying to query it with all lower-case.

In other words, the following fails:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

Use double-quotes to delimit identifiers so you can use the specific mixed-case spelling as the table is defined.

SELECT * FROM "SF_Bands";

Re your comment, you can add a schema to the "search_path" so that when you reference a table name without qualifying its schema, the query will match that table name by checked each schema in order. Just like PATH in the shell or include_path in PHP, etc. You can check your current schema search path:

SHOW search_path
  "$user",public

You can change your schema search path:

SET search_path TO showfinder,public;

See also http://www.postgresql.org/docs/8.3/static/ddl-schemas.html


It appears that even if you type SELECT * FROM SF_Bands this will still fail, because Postgres decides to lowercase that table name for you. Weird...
@romkyns: Yes, this is actually pretty common across RDBMS brands, that undelimited identifiers are advertised as "case-insensitive." But they're not truly case insensitive because the way they've implemented that is to force lowercase. This matches the name of the table only if you had allowed the table name to be lowercased when you defined the table. If you use double-quote delimiters when you CREATE TABLE, you must use delimiters when you reference it in queries.
Postgres automatically lowercases table names if they aren't in quotes? That's pretty asinine...
@Andy, when you write your own SQL database, feel free to implement case-insensitive identifiers some other way. :)
@BillKarwin Really, Postgres should be courageous enough to release more sensible, modern case handling as a breaking change.
A
Apurv

I had problems with this and this is the story (sad but true) :

If your table name is all lower case like : accounts you can use: select * from AcCounTs and it will work fine If your table name is all lower case like : accounts The following will fail: select * from "AcCounTs" If your table name is mixed case like : Accounts The following will fail: select * from accounts If your table name is mixed case like : Accounts The following will work OK: select * from "Accounts"

I dont like remembering useless stuff like this but you have to ;)


Same for column names in where-clauses
5. Mixed case, like Accounts, will fail with select * from Accounts; I find the weirdest part: same-case is NOT identical.
All there is to it: all names in postgres query are lowercase, unless you use quotes.
The fourth option worked for me, though I'm not using PHP
Thanks for laying out all the interactions! :)
a
a_horse_with_no_name

Postgres process query different from other RDMS. Put schema name in double quote before your table name like this, "SCHEMA_NAME"."SF_Bands"


What does your answer adds to the previously accepted answer, upvoted 22 times and with lot of details?
E
Eric Leschinski

Put the dbname parameter in your connection string. It works for me while everything else failed.

Also when doing the select, specify the your_schema.your_table like this:

select * from my_schema.your_table

Putting the schema name in, e.g. my_schema.my_relation into the query helped.
Thank you very much! It reall helps me solve the problem! But is there a way that i can omit the scheme name?
e
e382df99a7950919789725ceeec126

I had a similar problem on OSX but tried to play around with double and single quotes. For your case, you could try something like this

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

S
Steve Shipway

If a table name contains underscores or upper case, you need to surround it in double-quotes.

SELECT * from "Table_Name";

k
kira

You must write schema name and table name in qutotation mark. As below:

select * from "schemaName"."tableName";

A
Alexander Kuzichkin

This is realy helpfull

SET search_path TO schema,public;

I digged this issues more, and found out about how to set this "search_path" by defoult for a new user in current database.

Open DataBase Properties then open Sheet "Variables" and simply add this variable for your user with actual value.

So now your user will get this schema_name by defoult and you could use tableName without schemaName.


Ö
Özer

For me the problem was, that I had used a query to that particular table while Django was initialized. Of course it will then throw an error, because those tables did not exist. In my case, it was a get_or_create method within a admin.py file, that was executed whenever the software ran any kind of operation (in this case the migration). Hope that helps someone.


A
Ashutosh Kumar

I had the same issue as above and I am using PostgreSQL 10.5. I tried everything as above but nothing seems to be working.

Then I closed the pgadmin and opened a session for the PSQL terminal. Logged into the PSQL and connected to the database and schema respectively :

\c <DATABASE_NAME>;
set search_path to <SCHEMA_NAME>;

Then, restarted the pgadmin console and then I was able to work without issue in the query-tool of the pagadmin.


S
Sirius Bey

In addition to Bill Karwin's answer =>

Yes, you should surround the table name with double quotes. However, be aware that most probably php will not allow you to just write simply:

$query = "SELECT * FROM "SF_Bands"";

Instead, you should use single quotes while surrounding the query as sav said.

$query = 'SELECT * FROM "SF_Bands"';

m
marc_s

Easiest workaround is Just change the table name and all column names to lowercase and your issue will be resolved.

For example:

Change Table_Name to table_name and

Change ColumnName to columnname


A
Alexis Gamarra

You have to add the schema first e.g.

SELECT * FROM place.user_place;

If you don't want to add that in all queries then try this:

SET search_path TO place;

Now it will works:

SELECT * FROM user_place;

I
Indrajeet Gour

It might be silly for a few, but in my case - once I created the table I could able to query the table on the same session, but if I relogin with new session table does not exits.

Then I used commit just after creating the table and now I could able to find and query the table in the new session as well. Like this:

select * from my_schema.my_tbl;

Hope this would help a few.


M
Mohamad Alnatsha

Make sure that Table name doesn't contain any trailing whitespaces

https://i.stack.imgur.com/1dRpA.png


S
Siwei

I tried every good answer ( upvote > 10) but not works.

I met this problem in pgAdmin4.

so my solution is quite simple:

find the target table / scheme. mouse right click, and click: query-tool in this new query tool window, you can run your SQL without specifying set search_path to ; you can see the result: