Czy w PGSQL istnieje konieczność ujmowania obiektów w znaki "XXXXXX"?
Przykłady w manualu są bez "". Pytam w kontekście wywoływania zapytań z
aplikacji - pakowanie każdej kolumny, nazwy tabeli, schematu w "" będzie
uciążliwe.
Jeśli to kwestia ustawień to bardzo proszę o wskazanie gdzie to zmienić.
Korzystam z wersji 8.1.14
Nie ma potrzeby, ale ujęcie w cudzysłowy powoduje użycie takiej nazwy
jaka jest podana. Użycie bez cudzysłowu powoduje, że wewnętrznie
postgres zamieni nazwę na małe (albo duże, nie pamietam, przyjmijmy, że
małe) litery.
Jak zrobisz: CREATE TABLE GuZiK; to wtedy możesz do tej tabeli odwoływać
się przez:
guzik
GUZIK
GUzik
ale jak zrobisz: CREATE TABLE "GuZiK", to jedyną poprawną formą
odwołania będzie "GuZiK".
szymon
>Witam,
>W phpPgAdminie, czy też w pgAdminie zapytanie typu:
>select * from "Tabela" zwraca poprawny wynik, natomiast
>select * from Tabela zwraca błąd - brak relacji tabela.
A przypadkiem nie utworzyłeś tej tabeli wpisując nazwę w cudzysłowach? Wtedy
wielkość liter ma znaczenie.
--
Sławomir Szyszło
Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych
FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/
Archiwum http://groups.google.com/groups?group=pl.comp.bazy-danych
Tak zrobiłem. Jednak jestem tego świadom i w zapytaniu pilnuję wielkości
liter. Dziwi mnie jednak, żę mając tabelę utworzoną jak niżej:
CREATE TABLE "Tabela"
(
"Id" integer NOT NULL DEFAULT nextval(......)
}
zapytanie
select * from Tabela ;
zwraca: ERROR: relation "tabela" does not exist - proszę zwrócić uwagę,
że wypisał 'tabelę' z małych liter i rzeczywiście takiej nie ma...
natomiast
select * from "Tabela";
daje pożądany wynik.
czyli - jak opisywałem niżej Sławkowi, tworząc tabelę "Tabela" mogę się
do niej odwołać jedynie poprzez "Tabela", gdyż wpisując bez cudzysłowów
Tabela wewnętrznie postgres zamieni mi to na tabela i wywali błąd że
relacja tabela nie istnieje.
Dobrze rozumiem?
Rozwiązania:
- zmienić w skrypcie zakładającym tabele nazwy na małe litery i pomijać
"" w zapytaniach sql;
- zostawić jak jest ale wszystkie obiekty w zapytaniach sql muszą być w "";
- inne?
>Tak zrobiłem. Jednak jestem tego świadom i w zapytaniu pilnuję wielkości
>liter. Dziwi mnie jednak, żę mając tabelę utworzoną jak niżej:
>
>CREATE TABLE "Tabela"
>(
> "Id" integer NOT NULL DEFAULT nextval(......)
>}
>
>zapytanie
>
>select * from Tabela ;
>zwraca: ERROR: relation "tabela" does not exist - proszę zwrócić uwagę,
>że wypisał 'tabelę' z małych liter i rzeczywiście takiej nie ma...
Bo jak wpiszesz bez cudzysłowów to widać zamienia litery na małe i takich szuka
w słowniku systemowym.
>Rozwiązania:
>- zmienić w skrypcie zakładającym tabele nazwy na małe litery i pomijać
>"" w zapytaniach sql;
>- zostawić jak jest ale wszystkie obiekty w zapytaniach sql muszą być w "";
>- inne?
Zrób tak jak większość - nie wymuszaj wielkości liter w nazwach. Mnie by szlag
trafił, jakbym dla każdej tabeli i kolumny musiał cudzysłowy dopisywać.
Nie wiem dlaczego tak uparcie stosuje się te "", edytory baz danych też
często domyślnie używają "", to tak jak w niektórych
językach programowania z rozróżnianiem wielkości znaków w nazwach
zmiennych/funkcji - używanie PobierzDane() i pobierzDane() jest przecież
prostą drogą do katastrofy.
M.
Cudzysłowy nie są aż takie złe, nie ma innego sposobu utrzworzenia
tabeli "tabela" albo tabeli: "select". A niektórzy tak robią. Poza tym
jak generujesz przenośnego sqla, to nie wiesz czy w innej bazie słowo
guzik nie jest zastrzeżone i wtedy cały model idzie sobie gdzieś daleko.
Jak robisz tabele o nazwach "guzik" to nie ma problemu, możesz potem
odwoływać się do tego przez guzik i będzie dobrze. Ogólnie należy używać
małych liter i będzie to bardziej przenośne, nawet jak użyjesz
cudysłowów.
szymon
"Niektórzy" zabrzmiało, jak nagana. Czy kolumny o nazwach `left`,
`order` (notacja z MySQL) itp nie są powszechne?
artur
Nie są, podobnie jak auta bez hamulca ręcznego. Chciałbyś za każdym
razem wychodząc z auta pamiętać, że musisz podłożyć cegłę pod koła?
--
Aleksander 'A.L.E.C' Machniak http://alec.pl gg:2275252
LAN Management System Developer http://lms.org.pl
Roundcube Webmail Project Developer http://roundcube.net
Nie są, kiedy projektujesz po polsku. Ja mam tabelki:
objects (id, ..., left, top, width, height)
schedule (id, object_id, ..., order)
I co, takie dziwne? Czerwona lampka wcale mi się nie zapaliła, dopiero
jak dostałem wyjątek w kodzie. Jak używasz psql-a, to szybko cię szlag
trafi i zamienisz nazwy, ale wiele osób używa narzędzi wizualnych, na
których problemu nie widać.
artur
>Cudzysłowy nie są aż takie złe, nie ma innego sposobu utrzworzenia
>tabeli "tabela" albo tabeli: "select". A niektórzy tak robią. Poza tym
>jak generujesz przenośnego sqla, to nie wiesz czy w innej bazie słowo
>guzik nie jest zastrzeżone i wtedy cały model idzie sobie gdzieś daleko.
>Jak robisz tabele o nazwach "guzik" to nie ma problemu, możesz potem
>odwoływać się do tego przez guzik i będzie dobrze. Ogólnie należy używać
>małych liter i będzie to bardziej przenośne, nawet jak użyjesz
>cudysłowów.
Wystarczy sobie wymyślić stały przedrostek do nazwy tabeli i wtedy
prawdopodobieństwo trafienia na słowo kluczowe spada do zera.
np. RTY_OSOBY, RTY_SLOWNIK
Łatwiej też wtedy przechowywać tabele z różnych aplikacji w jednym schemacie.