Gibt es ein MySQL-Äquivalent zu SHOW CREATE TABLE in postgres?

66

Gibt es ein MySQL-Äquivalent SHOW CREATE TABLEin postgres? Ist das möglich? Wenn nicht, welche ist die nächstbeste Lösung?

Ich benötige die Anweisung, weil ich sie zum Erstellen der Tabelle auf einem Remoteserver (über WCF) verwende.

vlebar
quelle
Und ich dachte, MySQL war die Datenbank, in der alle coolen Features fehlten ...
Christopher K.

Antworten:

27

Sie können versuchen, in der PostgreSQL-Protokolldatei zu verfolgen, was "pg_dump -t table -s" wirklich tut. Dann können Sie mit derselben Methode Ihre eigene SQL-Funktion schreiben.

RJS
quelle
ok, ich habe den pg_dump verfolgt. Aber es war nicht so einfach, da ich meine eigene Funktion in C # schreiben musste, um die Anweisung create table zu schreiben. Aber es war eine große Hilfe, also vielen Dank veeeeerrrryyyy. : D
vlebar
Keine Notwendigkeit zu gehen , um all die Mühe - nach hier können Sie die verwenden -EOption zu verfolgen , was im Hintergrund vor sich geht , wenn Sie einen ausführen psqlBefehl - -E: will describe the underlaying queries of the \ commands (cool for learning!)- HTH!
4.
40

pg_dump:

pg_dump -st tablename dbname

oder benutze die PostgreSQL GUI Tools (pgAdmin, phpPgAdmin usw.)

alvosu
quelle
Ich werde versuchen, das Problem genauer zu erklären. Ich benötige die SQL-Anweisung (Select oder Stored Procedure), da ich den SQL-Befehl in C # (NpgsqlCommand) ausführe. Daher denke ich, dass pg_dump in diesem Fall nicht die Lösung ist. :(
vlebar
1
Warum nicht? --schema-onlyhat genau diesen Zweck: Zeigen Sie die SQL-Anweisungen an, um das Schema / die Tabelle zu erstellen. Sie können diese Ausgabe dann irgendwie in Ihr C # -Programm einspeisen.
Sven
Schauen Sie sich die information_schema-Ansichten an: postgresql.org/docs/9.0/interactive/information-schema.html
alvosu
1
@SvenW: Ich würde das tun, wenn ich einen bekannten Satz von Tabellen hätte. Das Problem besteht darin, dass der Benutzer bei Bedarf eine beliebige Tabelle in der ausgewählten Datenbank synchronisieren und die ausgewählte Tabelle dann auf einem Remoteserver hinter einem wcf-Dienst erstellen kann. Ich kann das mit Mssql und jetzt möchte ich das Client-Programm auf andere SQL-Server (Mysql, Oracle, Postgresql, ...) erweitern. OK, ich kann pg_dump für eine Tabelle, die der Benutzer synchronisieren möchte, aber wenn es ist überhaupt möglich, das nur in plsql zu tun, ich möchte es in plsql
vlebar
1
Wenn Sie einen .tarSpeicherauszug restore.sqlerstellen möchten , greifen Sie auf die Datei aus dem Archiv zu. Es hat alle create-Anweisungen.
Joseph Lust
15

In command line ( psql) können Sie Folgendes ausführen: \d <table name>um alle Spalten, ihre Typen und Indizes aufzulisten.

Lukasz Czerwinski
quelle
5
Dies ist hilfreich, beantwortet aber die Frage nicht.
Ryan Tuck
4

Aufbauend auf dem ersten Teil der Antwort von @ CubicalSoft können Sie die folgende Funktion einfügen, die für einfache Tabellen funktionieren soll (nimmt das Standardschema 'public' an und lässt Einschränkungen, Indizes und benutzerdefinierte Datentypen usw. usw. weg). Die @ RJS-Antwort ist im Moment die einzige Möglichkeit, dies richtig zu tun. das ist etwas, das in psql eingebaut werden sollte!

CREATE OR REPLACE FUNCTION show_create_table(table_name text, join_char text = E'\n' ) 
  RETURNS text AS 
$BODY$
SELECT 'CREATE TABLE ' || $1 || ' (' || $2 || '' || 
    string_agg(column_list.column_expr, ', ' || $2 || '') || 
    '' || $2 || ');'
FROM (
  SELECT '    ' || column_name || ' ' || data_type || 
       coalesce('(' || character_maximum_length || ')', '') || 
       case when is_nullable = 'YES' then '' else ' NOT NULL' end as column_expr
  FROM information_schema.columns
  WHERE table_schema = 'public' AND table_name = $1
  ORDER BY ordinal_position) column_list;
$BODY$
  LANGUAGE SQL STABLE;
EoghanM
quelle
Dies sollte die akzeptierte Antwort sein
exebook
Danke dafür!
Frank
3

Mir ist klar, dass ich ein bisschen zu spät zu dieser Party komme, aber dies war das erste Ergebnis meiner Google-Suche, also dachte ich, ich würde mit dem antworten, was ich mir ausgedacht habe.

Sie können mit dieser Abfrage ziemlich weit zu einer Lösung kommen, um die Spalten zu erhalten:

SELECT *
FROM information_schema.columns
WHERE table_schema = 'YOURSCHEMA' AND table_name = 'YOURTABLE'
ORDER BY ordinal_position;

Und dann diese Abfrage für die meisten gängigen Indizes:

SELECT c.oid, c.relname, a.attname, a.attnum, i.indisprimary, i.indisunique
FROM pg_index AS i, pg_class AS c, pg_attribute AS a
WHERE i.indexrelid = c.oid AND i.indexrelid = a.attrelid AND i.indrelid = 'YOURSCHEMA.YOURTABLE'::regclass
ORDER BY" => "c.oid, a.attnum

Dann müssen die Abfragezeichenfolgen im richtigen Format erstellt werden.

CubicleSoft
quelle
2

Wie in https://serverfault.com/a/875414/333439 beantwortet , ist es mit dem \d <table>Meta-Befehl in psqlmöglich, die Tabellenstruktur in der Datenbank anzuzeigen. Wenn Sie die im Meta-Befehl verwendete Abfrage anzeigen möchten, können Sie den Befehl verwenden psql -E. Wie in der Manpage beschrieben, gibt der -ESwitch die \dMetabefehlsabfragen wieder. Sie können also starten psql -E, die Tabellenstruktur mit dem \d <table>Metabefehl anzeigen und je nach -ESchalter die Abfrage anzeigen, die zur Beschreibung der Tabellenstruktur generiert wurde

Enrico Bianchi
quelle
0

In pgAdmin 4 finden Sie einfach die Tabelle im Baum auf der linken Seite, zB:

Servers
+ PostgreSQL 11
  + Databases
    + MYDATABASENAME
      + Schemas
        + public
          + Tables
            + MYTABLENAME  <-- click this tree element

Wenn die Tabelle ausgewählt ist, öffnen Sie die SQL-Registerkarte auf der rechten Seite. Es zeigt die CREATE TABLEfür die ausgewählte Tabelle.

Christopher K.
quelle