Sensibilité À La Casse Postgres
J'ai importé 100 tables dans Postgres à partir de MSSQL server 2008 via un outil qui a créé toutes les tables avec leurs colonnes dans majuscule . Maintenant, si je veux faire une vue de données à partir de la table par exemple-STD_TYPE_CODES as -
select * from STD_TYPE_CODES
Je reçois une erreur suivante -
ERROR: relation "std_type_codes" does not exist
LINE 1: select * from STD_TYPE_CODES
^
********** Error **********
ERROR: relation "std_type_codes" does not exist
SQL state: 42P01
Character: 15
Je sais que je peux mettre les guillemets autour du nom de la table comme -
select * from "STD_TYPE_CODES"
Mais comme j'ai travaillé avec MSSQL Server, il n'y a pas ce genre de problème. Donc, est-il possible de se débarrasser de cette? S'il vous plaît aider.
1 réponses
A_horse_with_no_name a raison.
Dans PostgreSQL, les noms non cités sont insensibles à la casse. Donc SELECT * FROM hello
et SELECT * FROM HELLO
sont équivalents.
Cependant, les noms cités sont sensibles à la casse. SELECT * FROM "hello"
est pas équivalent à SELECT * FROM "HELLO"
.
Pour faire un "pont" entre les noms cités et les noms non cités, les noms non cités sont implicitement en minuscules, ainsi hello
, HELLO
et {[6] } sont équivalents à "hello"
, mais pas à "HELLO"
ou "HeLLo"
(Oups!).
Ainsi, lors de la création d'entités (tables, vues, procédures, etc.) dans PostgreSQL, vous devez les spécifier soit sans guillemets, soit entre guillemets mais en minuscules.
Pour convertir des tables/vues / etc existantes, vous pouvez utiliser quelque chose comme ALTER TABLE "FOO" RENAME TO "foo"
.
Ou, essayez de modifier dump à partir de MSSQL pour le rendre "PostgreSQL-compatible" (de sorte qu'il contiendra foo
S ou "foo"
s mais pas "FOO"
s).
- soit en éditant explicitement le fichier de vidage. (Si vous utilisez Linux, vous pouvez faire
sed -r 's/"[^"]+"/\L\0/g' dumpfile
- cependant, soyez averti que cette commande peut modifiez également le texte dans les littéraux de chaîne.) - ou en spécifiant certaines options lors de l'obtention du dump à partir de MSSQL. (Je ne suis pas sûr s'il y a de telles options dans MSSQL, Je ne l'ai jamais utilisé, mais probablement de telles options devraient exister.)