Wie liste ich alle Spalten für eine angegebene Tabelle auf?

292

Ich suche eine genaue Information in einer Datenbank, über die ich keine Kenntnisse habe.

Es ist ein Produkt von Drittanbietern, sie beantworten einige Fragen nur langsam, und ich weiß, dass die Daten in dieser Datenbank liegen, daher möchte ich ein bisschen Retrotechnik betreiben.

Ist es bei einer gegebenen Tabelle möglich, eine Liste der Namen der Spalten für diese Tabelle zu haben?

Beispielsweise ist es in SqlServer möglich, eine Tabelle in wiederverwendbare CREATEAnweisungen zu sichern, in denen alle Spalten, aus denen die Tabelle besteht, textuell aufgelistet sind.

Stephane Rolland
quelle
Welchen Zugang haben Sie zur DB?
Dezso
@dezso, es ist auf einem separaten Computer, aber ich kann mich anmelden und die psql-Befehlszeile mit Administratorrechten starten
Stephane Rolland
6
Wenn ich dich richtig verstehe, bist du hinterher \dt[+] table_namein psql.
Dezso
1
Nee. \ dt + scheint den Spaltennamen nicht explizit anzuzeigen. Es wird nur ein Feld "Beschreibung" hinzugefügt.
Stephane Rolland
12
aber \ d + Tabellenname funktioniert!
Stephane Rolland

Antworten:

344

Zusätzlich zu der \d+ <table_name>bereits gefundenen Befehlszeile können Sie auch das Informationsschema verwenden , um die Spaltendaten nachzuschlagen information_schema.columns:

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

Hinweis: Stellen Sie gemäß dem obigen Beispiel sicher, dass die Werte in Anführungszeichen eingeschlossen sind.

bhamby
quelle
2
Verwenden Sie in psql \x onoder \pset expanded on, um die Abfrageergebnisse linear (anstatt tabellarisch) und damit übersichtlicher
anishpatel
4
In den aktuellen Versionen (in 9.6 ausprobiert) können Sie in psql \d+ public.*die Beschreibung (Schema + Indices / Fkeys / Trigger) aller Tabellen und Ansichten im publicSchema abrufen . Wir verwenden es in unserem Pre-Commit-Hook-Skript, um Änderungen in der Datenbank zu verfolgen, die von jedem Commit vorgenommen wurden.
Thalis K.
4
SELECT Spaltenname, um nur Spaltennamen zu erhalten
Andrew
82

Ergänzend zu den anderen Antworten werden die Spaltennamen auch bei einer SELECT-Anweisung, die keine Zeilen zurückgibt, für Sie und den Anwendungscode verfügbar gemacht.

select *
from table_name
where false;

Bei jedem dieser Ansätze können Berechtigungen zum Tragen kommen.

Mike Sherrill 'Cat Recall'
quelle
Ich nehme an, Sie wollen diese SQL an den Befehl psql übergeben. Ich empfehle in diesem Fall die Option --no-psqlrc, um Überraschungen bei der Ausgabe zu vermeiden.
JohnMudd
Mit Ausnahme der ausgeblendeten Spalten, die angegeben werden mussten, um ausgewählt zu werden (wie pg_class.oid)
okutane
71

Das Informationsschema ist langsam und sicher: Es ist standardisiert und weitgehend portierbar für andere Datenbanken, die es unterstützen. Und es wird weiterhin in allen Hauptversionen funktionieren.

Allerdings Ansichten im Informationsschema kommen oft in vielen Tabellen aus den Systemkatalogen ein streng standardisiertes Format gerecht zu werden - von denen viele nur tote Fracht der meiste Zeit. Das macht sie langsam .
Die Postgres-Entwickler machen keine Versprechungen, aber die Grundlagen (wie das, was hier benötigt wird) werden sich in den Hauptversionen nicht ändern.

psql(die native Befehlszeilenschnittstelle) geht natürlich auf die Überholspur und fragt die Quelle direkt ab. Wenn Sie psqlmit dem Parameter beginnen-E , wird der SQL-Code hinter Backslash-Befehlen \dangezeigt. Oder \set ECHO_HIDDEN onüber die psql-Befehlszeile. Von dort aus können Sie eine Antwort auf Ihre Frage erstellen.

Bei einer gegebenen Tabelle ist es möglich, eine Liste der Namen der Spalten für diese Tabelle zu haben.

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;

Schneller als Abfrageninformation_schema.columns . Versuchen Sie es selbst EXPLAIN ANALYZEzu sehen. Für eine einmalige Suche ist das immer noch kaum von Bedeutung. Kann aber einen Unterschied machen, wenn sie in einer Abfrage / Funktion verwendet wird, die viele Male wiederholt wird.

Es gibt auch subtile Unterschiede in der Sichtbarkeit. Detaillierter Vergleich:

Erwin Brandstetter
quelle
2
Wirklich so zeigst du dir -Eund zeigst den Leuten, wie man die SQL von PSQL bekommt.
Evan Carroll
6

psql auf PostgreSQL 11+

Wenn Sie in einer Abfrage nach den Spaltentypen suchen, können Sie psql's verwenden\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
quelle
0

Nur für PostgreSQL

Dies ist etwas hokey, könnte aber ein Konkurrent sein, wenn Sie nach dem kürzesten möglichen SQL suchen:

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

oder noch kürzer (vorausgesetzt, die Tabelle enthält mindestens eine Zeile)

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

Die Auflistung behält die Reihenfolge bei. Falls Sie sich nicht um die Reihenfolge kümmern und eine hstoreErweiterung installiert haben, können Sie diese noch kürzer ausführen

SELECT skeys(hstore(NULL::schema_name.table_name))
oᴉɹǝɥɔ
quelle