Jak wyświetlić listę wszystkich kolumn dla określonej tabeli

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

To jest produkt innej firmy, oni wolno odpowiadają na niektóre pytania i wiem, że dane znajdują się w tej bazie danych, więc chcę trochę popracować nad inżynierią retro.

Biorąc pod uwagę jedna tabela, czy można mieć listę nazw kolumn tej tabeli?

Na przykład w SqlServer można zrzucić tabelę do wielokrotnego użytku CREATE, które tekstowo wymienia wszystkie kolumny, z których składa się tabela.

Komentarze

  • Jakiego rodzaju dostępu potrzebujesz DB?
  • @dezso, jest na oddzielnej maszynie, ale mogę się do niego zalogować i uruchomić wiersz poleceń psql z uprawnieniami administratora
  • Jeśli dobrze cię rozumiem, są po \dt[+] table_name w psql.
  • nie. \ dt + nie t wydaje się jawnie wyświetlać nazwę kolumny. dodaje tylko pole " Opis ".
  • ale \ d + nazwa tabeli działa!

Odpowiedź

Oprócz wiersza poleceń \d+ <table_name>, które już znalazłeś, możesz użyj również schematu informacyjnego , aby wyszukać dane kolumny, używając information_schema.columns :

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

Uwaga: Jak w powyższym przykładzie, upewnij się, że wartości są ujęte w cudzysłowy.

Komentarze

  • W psql użyj \x on lub \pset expanded on, aby utworzyć zapytanie wyniki są liniowe (zamiast tabelaryczne), a przez to łatwiejsze do odczytania stackoverflow.com/a/9605093/513397
  • W aktualnych wersjach (wypróbowałem w 9.6) możesz zrobić w psql \d+ public.*, aby uzyskać opis (schemat + indeces / fkeys / triggers) wszystkich swoich tabel i widoków w public schemat. Używamy go w naszym skrypcie przechwytującym przed zatwierdzeniem, aby śledzić zmiany w bazie danych dokonywane przez każde zatwierdzenie.
  • SELECT nazwa_kolumny, aby uzyskać tylko nazwę kolumny

Odpowiedź

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

select * from table_name where false; 

W przypadku każdego z tych podejść w grę mogą wchodzić uprawnienia.

Komentarze

  • Zakładam, że chcesz przekazać ten kod SQL do polecenia psql. Proponuję użyć w takim przypadku opcji –no-psqlrc, aby uniknąć niespodzianek na wyjściu.
  • Z wyjątkiem ukrytych kolumn, które musiały być określone, aby były wybrane (jak pg_class.oid)

Odpowiedź

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

Jednak wyświetlenia w schemacie informacyjnym często dołączają do wiele tabel z katalogów systemowych , aby ściśle znormalizowany format – z których wiele to przez większość czasu martwy ładunek. To sprawia, że powolne .
Programiści Postgres nie obiecują, ale podstawy (takie jak to, co jest tutaj potrzebne) nie zmienią się w głównych wersjach.

psql (natywny interfejs wiersza poleceń) zajmuje oczywiście szybką ścieżkę i bezpośrednio pyta o źródło . Jeśli rozpoczniesz psql z parametrem -E , kod SQL za Wyświetlane są polecenia z ukośnikiem odwrotnym, takie jak \d. Lub \set ECHO_HIDDEN on z wiersza poleceń psql. Zaczynając od tego miejsca możesz zbudować odpowiedź na swoje pytanie.

Biorąc pod uwagę jedną tabelę, czy można mieć listę nazw kolumn do table.

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ż zapytania information_schema.columns . Spróbuj EXPLAIN ANALYZE i przekonaj się sam. Wciąż nie ma znaczenia dla jednorazowego wyszukiwania. Ale może mieć znaczenie, jeśli zostanie użyte w zapytaniu / funkcji, która jest wielokrotnie powtarzana.

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

Komentarze

  • Naprawdę w ten sposób pokazujesz -E i pokazujesz ludziom, jak zdobyć sql psql.
  • Zgadzam się.Przeprowadziłem kilka testów szybkości i pg_catalog działa ponad 2x szybciej

Odpowiedź

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) 

Odpowiedź

Tylko PostgreSQL

To trochę dziwaczne, ale może być rywalem, jeśli szukasz możliwie najkrótszego SQL:

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

lub nawet krócej (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 przejmujesz się zamówieniem i masz zainstalowane rozszerzenie hstore, możesz zrobić jeszcze krócej

SELECT skeys(hstore(NULL::schema_name.table_name)) 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *