Non è possibile utilizzare semplicemente il nome della tabella PostgreSQL ("la relazione non esiste")


183

Sto cercando di eseguire il seguente script PHP per eseguire una semplice query sul database:

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

Questo produce il seguente errore:

Query non riuscita: ERRORE: la relazione "sf_bands" non esiste

In tutti gli esempi che posso trovare dove qualcuno riceve un errore affermando che la relazione non esiste, è perché usano lettere maiuscole nel nome della tabella. Il nome della mia tabella non ha lettere maiuscole. C'è un modo per interrogare la mia tabella senza includere il nome del database, ad esempio showfinder.sf_bands?


2
Sei sicuro che la tabella sf_bands esiste? Showfinder.sf_bands funziona?
Brasile-Brasile,

1
showfinder.sf_bands funziona perfettamente
Keyslinger

Forse dovrei notare che il mio database è stato migrato da MySQL
Keyslinger il

Puoi provare pg_query ($ dbconn, $ query)? La connessione implicita può causare problemi difficili da debug, può anche eliminarlo come possibile problema. Puoi anche provare pg_dbname ($ dbconn) per assicurarti che sia effettivamente collegato a showfinder?
Brasile-Brasile,

1
+1 per menzionare che il problema è rappresentato dalle lettere maiuscole. Ho trascorso un'ora a cercare di capire perché non potevo scegliere da una singola tabella in PostgreSQL. Che programma terribile.
Brain2000,

Risposte:


298

Da quello che ho letto, questo errore significa che non stai facendo riferimento correttamente al nome della tabella. Un motivo comune è che la tabella è definita con un'ortografia mista e si sta tentando di interrogarla con tutte le lettere minuscole.

In altre parole, non riesce:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

Utilizzare le virgolette doppie per delimitare gli identificatori in modo da poter utilizzare l'ortografia specifica in maiuscole / minuscole man mano che viene definita la tabella.

SELECT * FROM "SF_Bands";

Per quanto riguarda il tuo commento, puoi aggiungere uno schema al "percorso_ricerca" in modo che quando fai riferimento a un nome di tabella senza qualificarlo, la query corrisponderà a quel nome di tabella controllando ogni schema in ordine. Proprio come PATHnella shell o include_pathin PHP, ecc. Puoi controllare il tuo percorso di ricerca dello schema corrente:

SHOW search_path
  "$user",public

È possibile modificare il percorso di ricerca dello schema:

SET search_path TO showfinder,public;

Vedi anche http://www.postgresql.org/docs/8.3/static/ddl-schemas.html


Oops, perdonami. Intendevo dire che il nome della mia tabella non ha lettere maiuscole, non il nome del mio database.
Keyslinger,

13
Sembra che anche se digiti, SELECT * FROM SF_Bandsciò non funzionerà, perché Postgres decide di rendere minuscolo il nome della tabella. Strano ...
Roman Starkov,

3
@romkyns: Sì, in realtà è abbastanza comune tra i marchi RDBMS, che gli identificatori non delimitati sono pubblicizzati come "senza distinzione tra maiuscole e minuscole". Ma non sono veramente insensibili alle maiuscole perché il modo in cui hanno implementato è quello di forzare le lettere minuscole. Questo corrisponde al nome della tabella solo se si era permesso che il nome della tabella fosse minuscola quando è stata definita la tabella. Se si utilizzano i delimitatori con virgolette doppie quando si CREA TABELLA, è necessario utilizzare i delimitatori quando si fa riferimento nelle query.
Bill Karwin,

Postgres mette automaticamente in minuscolo i nomi delle tabelle se non sono tra virgolette? È abbastanza stupido ...
Andy,

@Andy, quando scrivi il tuo database SQL, sentiti libero di implementare identificatori senza distinzione tra maiuscole e minuscole in qualche altro modo. :)
Bill Karwin

76

Ho avuto problemi con questo e questa è la storia (triste ma vera):

  1. Se il nome della tua tabella è tutto minuscolo come: account puoi usare: select * from AcCounTse funzionerà benissimo

  2. Se il nome della tabella è tutto minuscolo come: accounts Quanto segue non riuscirà: select * from "AcCounTs"

  3. Se il nome della tua tabella è composto da maiuscole / minuscole come: Accounts Non riuscirà: select * from accounts

  4. Se il nome della tua tabella è composto da maiuscole e minuscole come: Accounts Il seguente funzionerà correttamente: select * from "Accounts"

Non mi piace ricordare cose inutili come questa, ma devi farlo;)


1
Lo stesso vale per i nomi delle colonne nelle clausole where
Roland,

8
5. Caso misto, come Accounts, fallirà con select * from Accounts;Trovo la parte più strana: lo stesso caso NON è identico.
Roland,

7
Tutto quello che c'è da fare: tutti i nomi nella query postgres sono in minuscolo, a meno che tu non usi le virgolette.
Erndob,

1
La quarta opzione ha funzionato per me, anche se non sto usando PHP
Sayari

2
Grazie per aver esposto tutte le interazioni! :)
GetHacked,

16

Postgres elabora una query diversa da quella di altri RDMS. Inserisci il nome dello schema tra virgolette prima del nome della tabella in questo modo, "SCHEMA_NAME". "SF_Bands"


7
Cosa aggiunge la tua risposta alla risposta precedentemente accettata, aggiornata 22 volte e con molti dettagli?
Yaroslav,

16

Inserisci il parametro dbname nella stringa di connessione. Funziona per me mentre tutto il resto fallisce.

Inoltre, quando si effettua la selezione, specificare your_schema. your_tablecome questo:

select * from my_schema.your_table

1
È stato utile inserire il nome dello schema, ad esempio my_schema.my_relation nella query.
JoeTidee,

2
Grazie mille! Mi aiuta a risolvere il problema! Ma c'è un modo in cui posso omettere il nome dello schema?
Charlotte,

8

Ho avuto un problema simile su OSX ma ho provato a giocare con virgolette doppie e singole. Nel tuo caso, potresti provare qualcosa del genere

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

4

Questo è davvero utile

SET search_path TO schema,public;

Ho approfondito ulteriormente questi problemi e ho scoperto come impostare questo "percorso_ricerca" per impostazione predefinita per un nuovo utente nel database corrente.

Apri Proprietà DataBase quindi apri il foglio "Variabili" e aggiungi semplicemente questa variabile per il tuo utente con valore reale.

Quindi ora il tuo utente otterrà questo nome_schema per impostazione predefinita e potresti usare tableName senza schemaName.


4

È necessario scrivere il nome dello schema e il nome della tabella nel segno di qutotation. Come sotto:

select * from "schemaName"."tableName";

1

Per me il problema era che avevo usato una query per quella particolare tabella mentre Django era stato inizializzato. Ovviamente genererà un errore, perché quelle tabelle non esistevano. Nel mio caso, era un get_or_createmetodo all'interno di un file admin.py, che veniva eseguito ogni volta che il software eseguiva qualsiasi tipo di operazione (in questo caso la migrazione). Spero che aiuti qualcuno.


0

Devi prima aggiungere lo schema, ad es

SELECT * FROM place.user_place;

Se non vuoi aggiungerlo in tutte le query, prova questo:

SET search_path TO place;

Ora funzionerà:

SELECT * FROM user_place;

0

La soluzione più semplice è cambiare il nome della tabella e tutti i nomi delle colonne in minuscolo e il problema verrà risolto.

Per esempio:

  • Cambia Table_Nameintable_name e
  • Cambia ColumnNameincolumnname
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.