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

19

347

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?

Bayberry answered 29/3, 2009 at 20:16 Comment(6)
Are you sure that the sf_bands table exists? Does showfinder.sf_bands work?Stereopticon
showfinder.sf_bands works perfectlyBayberry
Perhaps I should note that my database was migrated from MySQLBayberry
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?Stereopticon
+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.Hoofbeat
I removed double quotes around the table name and it worksWean
S
496

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;

Read more about the search_path here: https://www.postgresql.org/docs/current/ddl-schemas.html#DDL-SCHEMAS-PATH

Shumaker answered 29/3, 2009 at 20:25 Comment(13)
Oops, forgive me. I meant to say that my table name has no uppercase letters, not my database name.Bayberry
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...Zumstein
@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.Shumaker
Postgres automatically lowercases table names if they aren't in quotes? That's pretty asinine...Hairsplitting
@Andy, when you write your own SQL database, feel free to implement case-insensitive identifiers some other way. :)Shumaker
@BillKarwin Really, Postgres should be courageous enough to release more sensible, modern case handling as a breaking change.Hairsplitting
Before you heap ill-guided invective on PostgreSQL, listen to what the SQL standard has to say: An <SQL language identifier> is equivalent to an <SQL language identifier> in which every letter that is a lower-case letter is replaced by the corresponding upper-case letter or letters. This treatment includes determination of equivalence, representation in the Information and Definition Schemas, representation in diagnostics areas, and similar uses. So while PostgreSQL does not follow the standard in that it folds everything to lower case, case insensitivity as such is required by the standard.Nd
Also make sure you are connected to the right db. Keyslinger was doing that right, but there are other workflows that might confuse people or make them oversee the database part.Foretopsail
On the off chance somebody else runs into this, I used camelCase accidentally in a Django ManyToManyField, which caused the migration to create a table of mysterious casing, which shows as lowercase in both pgadmin and psql, but SELECT * from mytable only worked as SELECT * from "mytable". I'm not really sure how to figure out what casing it actually is.Isabelleisac
In my case , I had written the table name in uppercase but it was in lowercase, thanks a lot . It saved a lot of my time.Atrioventricular
Rather than add name of database on the 'search path', why not first connect to the database before starting the search?Casablanca
@Gathide, You would connect to the database, then within that database, you may have multiple schemas. In PostgreSQL, a database and a schema are two different things. A schema is like a subdirectory within a top-level directory corresponding to the database.Shumaker
It should be noted that this behavior applies to any database object names in postgres, including schema and column names.Vivisectionist
H
104

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

  1. If your table name is all lower case like : accounts you can use: select * from AcCounTs and it will work fine

  2. If your table name is all lower case like : accounts The following will fail: select * from "AcCounTs"

  3. If your table name is mixed case like : Accounts The following will fail: select * from accounts

  4. 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 ;)

Hectare answered 3/9, 2012 at 15:35 Comment(4)
Same for column names in where-clausesKeon
5. Mixed case, like Accounts, will fail with select * from Accounts; I find the weirdest part: same-case is NOT identical.Keon
All there is to it: all names in postgres query are lowercase, unless you use quotes.Unweave
The fourth option worked for me, though I'm not using PHPZilpah
F
34

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

Felishafelita answered 10/7, 2012 at 20:10 Comment(0)
C
29

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
Clearsighted answered 3/3, 2011 at 18:38 Comment(2)
Putting the schema name in, e.g. my_schema.my_relation into the query helped.Covariance
Thank you very much! It reall helps me solve the problem! But is there a way that i can omit the scheme name?Nuremberg
S
24

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

SELECT * from "Table_Name";
Stansbury answered 19/9, 2020 at 3:27 Comment(1)
Underscores do not create a problem, only uppercase characters do.Vivisectionist
W
15

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"
Weeping answered 5/2, 2015 at 14:13 Comment(0)
P
13

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

select * from "schemaName"."tableName";
Pathan answered 6/9, 2019 at 7:38 Comment(0)
F
11

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.

Flashover answered 16/6, 2018 at 7:29 Comment(0)
T
4

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.

Trench answered 26/1, 2021 at 15:14 Comment(0)
L
3

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"';
Labroid answered 9/6, 2021 at 22:4 Comment(0)
T
2

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.

Tank answered 5/4, 2016 at 15:30 Comment(0)
K
2

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.

Krill answered 19/5, 2021 at 11:41 Comment(0)
S
1

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;
Stoa answered 26/4, 2020 at 16:34 Comment(0)
D
1

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
Dugan answered 7/5, 2020 at 5:59 Comment(0)
R
0

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

enter image description here

Randeerandel answered 3/10, 2021 at 22:33 Comment(0)
N
0

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

I met this problem in pgAdmin4.

so my solution is quite simple:

  1. find the target table / scheme.

  2. mouse right click, and click: query-tool

  3. in this new query tool window, you can run your SQL without specifying set search_path to <SCHEMA_NAME>;

    pgAdmin query tool

  4. you can see the result:

    query editor and data output

Newspaperwoman answered 27/4, 2022 at 12:6 Comment(0)
W
0

Try this: SCHEMA_NAME.TABLE_NAME

Wendelina answered 26/7, 2022 at 9:15 Comment(1)
Welcome to SO. Please look at the other answers to this question - you will see, that this way has been suggested by many of them.Kilroy
B
0

I'd suggest checking if you run the migrations or if the table exists in the database.

Busybody answered 24/11, 2022 at 16:9 Comment(1)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Vaughnvaught
W
0

postgres doesn't like its name casing to be capitalized, you either use an underscore to separate the names or you make all of them lowercase, and the database engine won't be able to locate the name.

Whale answered 3/11, 2023 at 5:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.