299 votes

Ne peuvent tout simplement pas utiliser PostgreSQL nom de la table ("relation n'existe pas")

Je suis en train d'exécuter le script PHP pour faire une simple requête de base de données:

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

Ce qui produit l'erreur suivante:

La requête a échoué: ERREUR: la relation "sf_bands" n'existe pas

Dans tous les exemples que je peux trouver, à laquelle quelqu'un obtient une erreur indiquant que le rapport n'existe pas, c'est parce qu'ils utilisent des lettres en majuscules dans leur nom de la table. Mon nom de la table n'a pas de majuscules. Est-il un moyen pour interroger ma table sans y compris le nom de base de données, c'est à dire showfinder.sf_bands?

438voto

Bill Karwin Points 204877

De ce que j'ai lu, cette erreur signifie que vous n'êtes pas de référencement, le nom de la table correctement. Une raison commune est que la table est définie avec une majuscules et l'orthographe, et que vous essayez de requête avec tous les bas-de-casse.

En d'autres termes, le suivant échoue:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

Utilisez les guillemets pour délimiter des identificateurs de sorte que vous pouvez les majuscules et l'orthographe au cours de la table est définie.

SELECT * FROM "SF_Bands";


Re votre commentaire, vous pouvez ajouter un schéma de la "search_path" de sorte que lorsque vous faites référence à un nom de table sans qualification de son schéma, la requête doit correspondre nom de la table par vérifié à chaque schéma dans l'ordre. Tout comme PATH de la coquille ou include_path en PHP, etc. Vous pouvez vérifier votre schéma actuel chemin de recherche de:

SHOW search_path
  "$user",public

Vous pouvez modifier votre schéma chemin de recherche de:

SET search_path TO showfinder,public;

Voir aussi http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

97voto

Natza Mitzi Points 491

J'ai eu des problèmes avec cela et c'est l'histoire (triste mais vrai) :

  1. Si le nom de votre table est en bas de casse comme : comptes vous pouvez utiliser: select * from AcCounTs et il fonctionne parfaitement

  2. Si le nom de votre table est en bas de casse comme : accounts Le suivant ne fonctionne pas: select * from "AcCounTs"

  3. Si le nom de votre table est mélangé à des cas comme : Accounts Le suivant ne fonctionne pas: select * from accounts

  4. Si le nom de votre table est mélangé à des cas comme : Accounts Ce qui suit fonctionnera OK: select * from "Accounts"

Je n'aime pas inutile de rappeler que ce genre de choses, mais vous devez vous ;)

27voto

Ugur Points 258

Postgres processus de requête différente des autres SGBDR. Mettre le nom du schéma en double devis avant le nom de votre table comme ceci, "SCHEMA_NAME"."SF_Bands"

25voto

JarosPL Points 11

Si tout le posté ci-dessus échoue, essayez de mettre dbname paramètre dans votre chaîne de connexion. Il fonctionne pour moi alors que tout le reste a échoué.

-6voto

pg_query($dbconn, $query);

assurez-vous que la connexion de base de données est un succès...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X