Jak wyświetlić wszystkie kolumny dla określonej tabeli

292

Szukam dokładnej informacji w bazie danych, o której nie mam wiedzy.

Jest to produkt innej firmy, wolno reagują na niektóre pytania i wiem, że dane znajdują się w tym db, więc chcę zrobić trochę inżynierii retro.

Biorąc pod uwagę jedną tabelę, czy można mieć listę nazw kolumn dla tej tabeli?

Na przykład w SqlServer możliwe jest zrzucenie tabeli do CREATEinstrukcji wielokrotnego użytku , które tekstowo wypisują wszystkie kolumny, z których składa się tabela.

Stephane Rolland
źródło
Jaki masz dostęp do bazy danych?
dezso,
@dezso, jest na osobnej maszynie, ale mogę się na nim zalogować i uruchomić wiersz polecenia psql, z uprawnieniami administratora
Stephane Rolland
6
Jeśli rozumiem zostanie poprawnie, jesteś po \dt[+] table_namew psql.
dezso,
1
nie. \ dt + nie wydaje się wyraźnie wyświetlać nazwy kolumn. dodaje tylko pole „Opis”.
Stephane Rolland
12
ale \ d + nazwa tabeli działa!
Stephane Rolland

Odpowiedzi:

344

Oprócz wiersza poleceń, \d+ <table_name>który już znalazłeś, możesz także użyć schematu informacyjnego do wyszukiwania danych w kolumnie, używając information_schema.columns:

SELECT *
  FROM information_schema.columns
 WHERE table_schema = 'your_schema'
   AND table_name   = 'your_table'
     ;

Uwaga: zgodnie z powyższym przykładem upewnij się, że wartości są zawarte w cudzysłowach.

bhamby
źródło
2
W psql użyj \x onlub, \pset expanded onaby wyniki zapytania były liniowe (zamiast tabelaryczne), a tym samym łatwiejsze do odczytania stackoverflow.com/a/9605093/513397
anishpatel
4
W bieżących wersjach (wypróbowałem to w wersji 9.6) możesz to zrobić w psql, \d+ public.*aby uzyskać opis (schemat + indeces / fkeys / triggers) wszystkich twoich tabel i widoków w publicschemacie. Używamy go w naszym skrypcie przechwytującym przed zatwierdzeniem, aby śledzić zmiany w bazie danych wprowadzone przez każde zatwierdzenie.
Thalis K.,
4
WYBIERZ nazwę_kolumny, aby uzyskać tylko nazwę kolumny
Andrew
82

Jako uzupełnienie innych odpowiedzi, nawet instrukcja SELECT, która nie zwraca żadnych wierszy, ujawni nazwy kolumn dla ciebie i kodu aplikacji.

select *
from table_name
where false;

Uprawnienia mogą wchodzić w grę z dowolnym z tych podejść.

Mike Sherrill „Cat Recall”
źródło
Zakładam, że masz zamiar przekazać ten kod SQL do komendy psql. W takim przypadku sugeruję użycie opcji --no-psqlrc, aby uniknąć niespodzianek na wyjściu.
JohnMudd,
Z wyjątkiem ukrytych kolumn, które trzeba było określić, aby je wybrać (jak pg_class.oid)
okutane
71

Schematu informacja jest powolny i pewny sposób: jest to w dużej mierze ujednolicone i przenośny do innych baz danych, które go obsługują. I będzie działać w głównych wersjach.

Jednak widoki w schemacie informacyjnym często łączą się w wielu tabelach z katalogów systemowych, aby spełniać ściśle znormalizowany format - z których wiele jest w większości przypadków tylko martwym ładunkiem. To spowalnia ich .
Programiści Postgres nie składają obietnic, ale podstawy (takie jak potrzebne tutaj) nie zmienią się w głównych wersjach.

psql(natywny interfejs wiersza poleceń) ma oczywiście szybki pas i bezpośrednio wysyła zapytania do źródła. Jeśli zaczniesz psqlod parametru-E , \dzostanie wyświetlony kod SQL za poleceniami odwrotnego ukośnika . Lub \set ECHO_HIDDEN onz wiersza polecenia psql. Od tego momentu możesz zbudować odpowiedź na swoje pytanie.

Biorąc pod uwagę jedną tabelę, czy można mieć listę nazw kolumn dla tej tabeli.

SELECT attrelid::regclass AS tbl
     , attname            AS col
     , atttypid::regtype  AS datatype
       -- more attributes?
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass  -- table name, optionally schema-qualified
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;

Szybciej niż zapytaniainformation_schema.columns . Spróbuj EXPLAIN ANALYZEprzekonać się sam. Nadal nie ma znaczenia dla jednorazowego wyszukiwania. Ale może mieć znaczenie, jeśli zostanie użyty w zapytaniu / funkcji, która jest powtarzana wiele razy.

Istnieją również subtelne różnice w widoczności. Szczegółowe porównanie:

Erwin Brandstetter
źródło
2
Naprawdę tak, że pokazujesz -Ei pokazujesz ludziom, jak uzyskać sql psql.
Evan Carroll,
6

psql na PostgreSQL 11+

Jeśli szukasz typów kolumn w zapytaniu, możesz użyć psql's'\gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
    $1 AS four,
    sin($2) as five,
    'foo'::varchar(4) as six,
    CURRENT_DATE AS now
\gdesc
 Column |         Type         
--------+----------------------
 zero   | text
 one    | integer
 two    | numeric
 three  | text
 four   | text
 five   | double precision
 six    | character varying(4)
 now    | date
(8 rows)
Evan Carroll
źródło
0

Tylko PostgreSQL

Jest to nieco hokey, ale może być wyzwaniem, jeśli szukasz najkrótszego możliwego SQL:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

lub nawet krótszy (zakładając, że w tabeli jest co najmniej jeden wiersz)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

Lista zachowuje kolejność. Jeśli nie zależy Ci na zamówieniu i masz hstorezainstalowane rozszerzenie, możesz zrobić to jeszcze krócej

SELECT skeys(hstore(NULL::schema_name.table_name))
oᴉɹǝɥɔ
źródło