web-dev-qa-db-fra.com

PostgreSQL ERROR: 42P01: la relation "[Table]" n'existe pas

Je rencontre ce problème étrange avec PostgreSQL 9.3 avec des tables créées avec qoutes. Par exemple, si je crée une table en utilisant qoutes:

create table "TEST" ("Col1" bigint);

la table est correctement créée et je peux voir que les guillemets sont préservés lors de sa visualisation dans le volet SQL de pgAdminIII. Mais lorsque j'interroge la base de données pour trouver la liste de toutes les tables disponibles (à l'aide de la requête ci-dessous), je constate que le résultat ne contient pas de guillemets autour du nom de la table.

select table_schema, table_name from information_schema.tables where not table_schema='pg_catalog' and not table_schema='information_schema';

Étant donné que la table a été créée avec des guillemets, je ne peux pas utiliser directement le nom de la table renvoyé par la requête ci-dessus, car il est non mis entre guillemets et renvoie l'erreur dans posts dans le titre.

Je pourrais essayer d'entourer les noms de table avec des guillemets dans toutes les requêtes, mais je ne suis pas sûr que cela fonctionnera tout le temps. Je cherche un moyen d'obtenir la liste des noms de table cités avec des guillemets dans le résultat.

Je rencontre le même problème avec les noms de colonne, mais j'espère que si je parviens à trouver une solution au problème des noms de table, une solution similaire fonctionnera également pour les noms de colonne.

7
Rahul Vijay Dawda

vous avez deux choix: - pas de guillemets: alors tout sera automatiquement mis en minuscule et non sensible à la casse - avec des guillemets: tout est désormais sensible à la casse.

je recommande fortement de NE PAS utiliser de guillemets et faire en sorte que PostgreSQL ne se comporte pas comme un cas. ça rend la vie tellement plus facile. Une fois que vous aurez commencé à citer, vous devrez l'utiliser PARTOUT, car PostgreSQL va commencer à être très précis.

quelques exemples:

   TEST = test       <-- non case sensitive
   "Test" <> Test    <-- first is precise, second one is turned to lower case
   "Test" = "Test"   <-- will work
   "test" = TEST     <-- should work; but you are just lucky.

essayez vraiment d'éviter ce genre de tromperie à tout prix. rester avec ascii 7 bits pour les noms d'objet.

17

Une fonction de chaîne utilisée pour citer de manière appropriée les identificateurs dans une chaîne d'instruction SQL est quote_ident() , qui fait référence à bon exemple (utilisé conjointement avec quote_literal()).

Pour utiliser votre exemple et mélanger d'autres résultats:

select
   quote_ident(table_schema) as table_schema,
   quote_ident(table_name) as table_name
...

 table_schema |    table_name
--------------+------------------
 ...
 public       | good_name
 public       | "table"
 public       | some_table
 public       | "something else"
 public       | "Tom's work"
 public       | "TEST"
 ...
0
Mike T