2011-08-31 7 views
12

J'ai créé une table Abc dans le schéma public de ma base de données postgresql. Selon la documentation public devrait être le schéma par défaut. search_path est défini sur "$user",public comme prévu. Mais ce qui suit échoue:Postgresql: confusion de nom de table/schéma

select * from Abc 

et cet appel échoue aussi:

select * from public.Abc 

Les deux produisent une erreur en disant que relation ... does not exist. Mais celui-ci fonctionne très bien:

select * from public."Abc" 

Je suis un développeur T-SQL expérimenté, mais nouveau pour postgresql. Selon la documentation, il devrait être possible d'utiliser SQL "normal" avec postgresql. Mais ça ne marche pas dans mon cas. N'importe quel indice ce que j'ai pu avoir foiré !?

Répondre

9

par défaut Postgresql à caractères minuscules tout en étant sensible à la casse avec la colonne/noms de table:

select * from public.Abc 

est en réalité:.

select * from public.abc 

C'est parce que votre table est appelée Abc, donc il ne peut pas être trouvé

Vous pouvez remplacer ce comportement en minuscules par des guillemets, de sorte que "Abc" soit traité comme Abc.

+3

Une bonne règle de base que je vis dans le monde PG est l'utilisation de traits de soulignement au lieu de chameau comme vous le feriez dans Microsoft SQL Server. Faites donc fast_table au lieu de "FastTable". Je trouve des citations supplémentaires au minimum pour être agaçantes. Bien que d'autres pourraient trouver des traits de soulignement pour être le même. Mais je viens de l'arrière-plan d'Oracle et je suis habitué. – Kuberchaun

5

Ne faites pas confiance à un casse mixte. Le meilleur pour votre santé mentale est de ne jamais utiliser des cas mixtes. Le schéma public est (pour la plupart) le schéma par défaut et peut être omis.

+0

La raison de ce conseil est que vous rencontrez rapidement des problèmes lorsque votre modèle est exporté vers une autre installation, avec d'autres paramètres de sensibilité (in). – wildplasser

6

Ceci est normal, les noms d'objets comme les tables et les colonnes sont insensibles à la casse, à moins que vous les mettez entre guillemets ». Ce comportement est standard SQL.

+0

Juste pour l'exhaustivité. Ai-je raison de dire que la norme SQL exige que les noms sans guillemets agissent de la même manière que les guillemets ** en majuscule **? En d'autres termes 'Abc ≡" ABC "'? –

+2

@Grzegorz: AFAIK, les noms de table et de colonne sont censés être normalisés en majuscules, sauf si cité; PostgreSQL, OTOH, convertit les noms en minuscules à la place. –