[PostrgeSQL] Nazwa kolumny PK
Piotr 'piter' Hlawski - 14-05-2006 00:48
[PostrgeSQL] Nazwa kolumny PK
Witam,
W jaki sposób wyciągnąć z tablic systemowych nazwę kolumny/kolumn będących częścią klucza głównego znając tylko nazwę tablicy i schematu? Inaczej rzecz biorąc - mam np. scheme usr i tablicę uzytkownik, chciałbym znać nazwę kolumny klucza głównego.
-- ..:: Piter // phlawski$gmail,com // gg: 4534287 ::. Chuck Norris kiedyś zjadł trzy ośmio kilowe steki w godzinę. Pierwsze 45 minut spędził uprawiając sex z kelnerką.
Piotr 'piter' Hlawski - 14-05-2006 00:48
Piotr 'piter' Hlawski wrote:
> Witam, > > W jaki sposób wyciągnąć z tablic systemowych nazwę kolumny/kolumn będących > częścią klucza głównego znając tylko nazwę tablicy i schematu? Inaczej > rzecz biorąc - mam np. scheme usr i tablicę uzytkownik, chciałbym znać > nazwę kolumny klucza głównego. >
Hmmm wymyśliłem coś takiego:
SELECT a.attname FROM pg_class c LEFT JOIN pg_constraint x ON c.oid = x.conrelid LEFT JOIN pg_attribute a ON c.oid = a.attrelid WHERE c.relname = 'nazwa_tablicy' AND x.contype = 'p' AND (a.attnum = x.conkey[1] OR a.attnum = x.conkey[2] OR a.attnum = x.conkey[3]);
Tylko to ogranicza do kluczy na max 3 polach - fakt faktem, nie mam nigdzie tablic z więcej niż dwukolumnowym PK, ale mimo to powyższe zapytanie jakoś mnie drażni z tym ograniczeniem :)
-- ..:: Piter // phlawski$gmail,com // gg: 4534287 ::. Chuck Norris pobił rekord świata na 100 metrów o pięć sekund. Chuck biegł w wodzie po szyję i ciągnął za sobą statek.
=?ISO-8859-2?Q?Micha=B3_Zaborowski?= - 15-05-2006 00:09
Pewnie lepiej by było wypisać nazwę schematu i nazwę tabeli. Tak czy owak - zapytanie może wyglądać tak: <code> SELECT a.attname FROM pg_class c LEFT JOIN pg_constraint x ON c.oid = x.conrelid LEFT JOIN pg_attribute a ON c.oid = a.attrelid WHERE c.relname = 'tfn' AND x.contype = 'p' AND a.attnum = any(x.conkey) </code> Tak na marginesie operacja '= any()' jest dość szybka, wypada lepiej niż 'in (select)'. Na listach PG jest do dużych INów. Chociaż oczywiście zamiast dwóch ostatnich warunków można zastosować subselect. -- Pozdrawiam, Michał Zaborowski (TeXXaS)
Piotr 'piter' Hlawski - 15-05-2006 00:09
Michał Zaborowski wrote:
> Pewnie lepiej by było wypisać nazwę schematu i nazwę tabeli. > Tak czy owak - zapytanie może wyglądać tak: > <code> > SELECT > a.attname > FROM pg_class c > LEFT JOIN pg_constraint x ON c.oid = x.conrelid > LEFT JOIN pg_attribute a ON c.oid = a.attrelid > WHERE > c.relname = 'tfn' AND > x.contype = 'p' AND > a.attnum = any(x.conkey) > </code> > Tak na marginesie operacja '= any()' jest dość szybka, wypada > lepiej niż 'in (select)'. Na listach PG jest do dużych INów. > Chociaż oczywiście zamiast dwóch ostatnich warunków można > zastosować subselect.
Dzięki :-)
-- ..:: Piter // phlawski$gmail,com // gg: 4534287 ::. Chuck Norris zagrał Dartha Vadera. Mistrza Yode też.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Jak =?ISO-8859-2?Q?zamieni=E6_dwa_pola_jednej_kolumny_?==?ISO-8859-2?Q?w_dw=F3ch_rekordach_za_pomoc=B1_jednego_zapyt? ==?ISO-8859-2?Q?ania=3F?=
[mysql] =?ISO-8859-2?Q?po=B3=B1czenie_tabel_wg_kolumn=2C_?==?ISO-8859-2?Q?nie_wierszy?=
ms sql server - =?ISO-8859-2?Q?domy=B6lny_format_kolumn_ty?==?ISO-8859-2?Q?pu_datetime?=
[ORACLE] Dodanie kolumny typu BLOB - =?ISO-8859-2?Q?wp=B3yw_na?==?ISO-8859-2?Q?_wydajno=B6c?=
=?ISO-8859-2?Q?=5BORACLE=2C_ORDER_BY=5D_Czy_indeksowane_?==?I SO-8859-2?Q?kolumny_przy=B6piesz=B1_sortowanie=3F?=
pytanie o zapytanie z having count = count z innej kolumny
[MySQL/PHP] Wyszukiwanie rekordu przez kolumnę wskazaną przez zmienną
=?iso-8859-2?q?Pytanie_SQL__spe=B3niaj=B1ce_wiecej_jak_jeden_ warunek_na_jednej_kolumnie=2E?=
=?iso-8859-2?Q?=5BMSSQL2005=5D_Zawarto=B6c_kolumny_varbinary= 28max=29_?=
SELECT MAX(nazwaPola) FROM tabela WHERE .... i ORA-01405: pobran? warto?ci? kolumny jest NULL
zanotowane.pldoc.pisz.plpdf.pisz.plchinska-zupka.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|