So generieren Sie die SQL-Anweisung "create table" für eine vorhandene Tabelle in postgreSQL

249

Ich habe eine Tabelle in postgreSQL erstellt. Ich möchte mir die SQL-Anweisung ansehen, mit der die Tabelle erstellt wurde, kann sie aber nicht herausfinden.

Wie erhalte ich die create tableSQL-Anweisung für eine vorhandene Tabelle in Postgres über die Befehlszeile oder die SQL-Anweisung?

Raja
quelle

Antworten:

358
pg_dump -t 'schema-name.table-name' --schema-only database-name

Weitere Infos - im Handbuch .

Milen A. Radev
quelle
53
Ich musste auch die Datenbank angeben. pg_dump mydb -t mytable --schema-only.
Nic
1
@Milen A. Radev: Bitte bearbeiten Sie die Antwort so, dass sie den Datenbanknamen enthält. Ich habe 5 Minuten damit verbracht, Variationen dieses qualifizierten Syntaxtes auszuprobieren (da ich nicht die Standard-Datenbank verwendet habe). Vielen Dank!
FarthVader
1
Ich konnte das nicht zum Laufen bringen, es würde nur nichts ausgeben. Ich habe pgAdminIII heruntergeladen und ihr Tool verwendet, um mir eine Show zu erstellen. Ich bin überrascht, dass postgres diese Funktionalität nicht hat, ohne einen Dump erstellen zu müssen.
Amalgovinus
5
Ersetzen Sie aschemadurch den tatsächlichen Schemanamen der Tabelle, die Sie sichern möchten. Ersetzen Sie atabledurch den tatsächlichen Tabellennamen der Tabelle, die Sie sichern möchten.
Steveha
6
Dies funktioniert, aber wenn der Tabellenname Großbuchstaben enthält, müssen Sie den Tabellennamen in einfache und doppelte Anführungszeichen setzen: pg_dump mydb -t '"TableName"' --schema-only- Andernfalls erkennt pg_dump den Tabellennamen nicht.
Josh
80

Meine Lösung besteht darin, sich mit psql mit der Option -E wie folgt bei der postgres-Datenbank anzumelden:

psql -E -U username -d database   

Führen Sie in psql die folgenden Befehle aus, um die SQL anzuzeigen, die postgres zum Generieren
der Beschreibungstabellenanweisung verwendet:

-- List all tables in the schema (my example schema name is public)
\dt public.*
-- Choose a table name from above
-- For create table of one public.tablename
\d+ public.tablename  

Basierend auf dem SQL, das nach dem Ausführen dieser Beschreibungsbefehle ausgegeben wurde, konnte ich
die folgende plpgsql-Funktion zusammenstellen:

CREATE OR REPLACE FUNCTION generate_create_table_statement(p_table_name varchar)
  RETURNS text AS
$BODY$
DECLARE
    v_table_ddl   text;
    column_record record;
BEGIN
    FOR column_record IN 
        SELECT 
            b.nspname as schema_name,
            b.relname as table_name,
            a.attname as column_name,
            pg_catalog.format_type(a.atttypid, a.atttypmod) as column_type,
            CASE WHEN 
                (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                 FROM pg_catalog.pg_attrdef d
                 WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN
                'DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                              FROM pg_catalog.pg_attrdef d
                              WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
            ELSE
                ''
            END as column_default_value,
            CASE WHEN a.attnotnull = true THEN 
                'NOT NULL'
            ELSE
                'NULL'
            END as column_not_null,
            a.attnum as attnum,
            e.max_attnum as max_attnum
        FROM 
            pg_catalog.pg_attribute a
            INNER JOIN 
             (SELECT c.oid,
                n.nspname,
                c.relname
              FROM pg_catalog.pg_class c
                   LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
              WHERE c.relname ~ ('^('||p_table_name||')$')
                AND pg_catalog.pg_table_is_visible(c.oid)
              ORDER BY 2, 3) b
            ON a.attrelid = b.oid
            INNER JOIN 
             (SELECT 
                  a.attrelid,
                  max(a.attnum) as max_attnum
              FROM pg_catalog.pg_attribute a
              WHERE a.attnum > 0 
                AND NOT a.attisdropped
              GROUP BY a.attrelid) e
            ON a.attrelid=e.attrelid
        WHERE a.attnum > 0 
          AND NOT a.attisdropped
        ORDER BY a.attnum
    LOOP
        IF column_record.attnum = 1 THEN
            v_table_ddl:='CREATE TABLE '||column_record.schema_name||'.'||column_record.table_name||' (';
        ELSE
            v_table_ddl:=v_table_ddl||',';
        END IF;

        IF column_record.attnum <= column_record.max_attnum THEN
            v_table_ddl:=v_table_ddl||chr(10)||
                     '    '||column_record.column_name||' '||column_record.column_type||' '||column_record.column_default_value||' '||column_record.column_not_null;
        END IF;
    END LOOP;

    v_table_ddl:=v_table_ddl||');';
    RETURN v_table_ddl;
END;
$BODY$
  LANGUAGE 'plpgsql' COST 100.0 SECURITY INVOKER;

Hier ist die Funktionsnutzung:

SELECT generate_create_table_statement('tablename');

Und hier ist die drop-Anweisung, wenn diese Funktion nicht dauerhaft bestehen bleiben soll:

DROP FUNCTION generate_create_table_statement(p_table_name varchar);
Webmut
quelle
2
Schön, ich habe nach einem plpgsql-Weg gesucht. Der LOOP-Teil ist allerdings etwas kaputt, er generiert die erste Spalte zweimal und überspringt die letzte Spalte. Ich habe den Beitrag bearbeitet, um dies zu beheben.
Webmut
Sehr nützlich, da Sie damit auch eine Tabellenanweisung für Ansichten erstellen können :)
Wolph
"Basierend auf dem SQL, das nach dem Ausführen dieser Beschreibungsbefehle ausgegeben wurde" - Ich sehe keine SQL-Ausgabe. nur Spaltenbeschreibungen. vermisse ich etwas
Ekkis
Die Verwendung von generate_create_table_statement ('my_table') führt zu einer Nichtübereinstimmung des Argumenttyps. Die Verwendung von generate_create_table_statement (my_table) ohne das Anführungszeichen in der Spalte "my_table" ist nicht vorhanden. Vermutung ist ein psql-versionabhängiges Problem. Irgendwelche Ideen?
Jason Morgan
Leider gibt diese Funktion nur NULLfür mich zurück ... Und wie wird das Schema behandelt? Sollte es CREATE-Anweisungen für Tabellen mit dem angegebenen Namen aus allen Schemas zurückgeben?
Matthias Samsel
38

Generieren Sie die Anweisung create table für eine Tabelle in postgresql über die Linux-Befehlszeile:

Diese Anweisung gibt die Tabelle create sql Anweisung für mich aus:

pg_dump -U your_db_user_name your_database -t your_table_name --schema-only

Erläuterung:

Mit pg_dump können wir Informationen über die Datenbank selbst abrufen. -Usteht für Benutzername. Mein pgadmin-Benutzer hat kein Passwort festgelegt, daher muss ich kein Passwort eingeben. Die -tOption bedeutet, für eine Tabelle anzugeben. --schema-onlybedeutet, dass nur Daten über die Tabelle und nicht die Daten in der Tabelle gedruckt werden. Hier ist der genaue Befehl, den ich benutze:

pg_dump -U pgadmin kurz_prod -t fact_stock_info --schema-only
Eric Leschinski
quelle
26

Wenn Sie die create-Anweisung für eine Tabelle ohne Verwendung von pg_dump suchen möchten, funktioniert diese Abfrage möglicherweise für Sie (ändern Sie den Tabellennamen mit dem Namen Ihrer Tabelle):

SELECT                                          
  'CREATE TABLE ' || relname || E'\n(\n' ||
  array_to_string(
    array_agg(
      '    ' || column_name || ' ' ||  type || ' '|| not_null
    )
    , E',\n'
  ) || E'\n);\n'
from
(
  SELECT 
    c.relname, a.attname AS column_name,
    pg_catalog.format_type(a.atttypid, a.atttypmod) as type,
    case 
      when a.attnotnull
    then 'NOT NULL' 
    else 'NULL' 
    END as not_null 
  FROM pg_class c,
   pg_attribute a,
   pg_type t
   WHERE c.relname = 'tablename'
   AND a.attnum > 0
   AND a.attrelid = c.oid
   AND a.atttypid = t.oid
 ORDER BY a.attnum
) as tabledefinition
group by relname;

Wenn es direkt von psql aufgerufen wird, ist es nützlich, Folgendes zu tun:

\pset linestyle old-ascii

Auch die Funktion generate_create_table_statement in diesem Thread funktioniert sehr gut.

shekwi
quelle
Warum möchten Sie dies aus Neugier tun, anstatt nur pg_dump zu verwenden?
Christopher Reid
7
Hallo. Mein Anwendungsfall war, dass ich Zugriff auf die Datenbank hatte, aber nicht auf die Shell. Zum Ausführen von pg_dump muss ein Systembenutzer vorhanden sein.
Shekwi
Ja, dies führt jedoch nicht zu den Berechtigungen und Einschränkungen, die ich am Ende von sehe pg_dump.
trotzdem
1
Genialer Code, besonders für diejenigen von uns, die aus MySQL kommen und SHOW CREATE TABLE table_name verwenden. Außerdem greife ich auf eine Datenbank mit eingeschränkten Berechtigungen zu, sodass dies perfekt ist.
Eric P
1
Schön, aber es enthält keine DEFAULT-Werte.
Dland
16

Dean Toader Einfach exzellent! Ich würde Ihren Code ein wenig ändern, um alle Einschränkungen in der Tabelle anzuzeigen und die Verwendung der Regexp-Maske im Tabellennamen zu ermöglichen.

CREATE OR REPLACE FUNCTION public.generate_create_table_statement(p_table_name character varying)
  RETURNS SETOF text AS
$BODY$
DECLARE
    v_table_ddl   text;
    column_record record;
    table_rec record;
    constraint_rec record;
    firstrec boolean;
BEGIN
    FOR table_rec IN
        SELECT c.relname FROM pg_catalog.pg_class c
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
                WHERE relkind = 'r'
                AND relname~ ('^('||p_table_name||')$')
                AND n.nspname <> 'pg_catalog'
                AND n.nspname <> 'information_schema'
                AND n.nspname !~ '^pg_toast'
                AND pg_catalog.pg_table_is_visible(c.oid)
          ORDER BY c.relname
    LOOP

        FOR column_record IN 
            SELECT 
                b.nspname as schema_name,
                b.relname as table_name,
                a.attname as column_name,
                pg_catalog.format_type(a.atttypid, a.atttypmod) as column_type,
                CASE WHEN 
                    (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                     FROM pg_catalog.pg_attrdef d
                     WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN
                    'DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                                  FROM pg_catalog.pg_attrdef d
                                  WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
                ELSE
                    ''
                END as column_default_value,
                CASE WHEN a.attnotnull = true THEN 
                    'NOT NULL'
                ELSE
                    'NULL'
                END as column_not_null,
                a.attnum as attnum,
                e.max_attnum as max_attnum
            FROM 
                pg_catalog.pg_attribute a
                INNER JOIN 
                 (SELECT c.oid,
                    n.nspname,
                    c.relname
                  FROM pg_catalog.pg_class c
                       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
                  WHERE c.relname = table_rec.relname
                    AND pg_catalog.pg_table_is_visible(c.oid)
                  ORDER BY 2, 3) b
                ON a.attrelid = b.oid
                INNER JOIN 
                 (SELECT 
                      a.attrelid,
                      max(a.attnum) as max_attnum
                  FROM pg_catalog.pg_attribute a
                  WHERE a.attnum > 0 
                    AND NOT a.attisdropped
                  GROUP BY a.attrelid) e
                ON a.attrelid=e.attrelid
            WHERE a.attnum > 0 
              AND NOT a.attisdropped
            ORDER BY a.attnum
        LOOP
            IF column_record.attnum = 1 THEN
                v_table_ddl:='CREATE TABLE '||column_record.schema_name||'.'||column_record.table_name||' (';
            ELSE
                v_table_ddl:=v_table_ddl||',';
            END IF;

            IF column_record.attnum <= column_record.max_attnum THEN
                v_table_ddl:=v_table_ddl||chr(10)||
                         '    '||column_record.column_name||' '||column_record.column_type||' '||column_record.column_default_value||' '||column_record.column_not_null;
            END IF;
        END LOOP;

        firstrec := TRUE;
        FOR constraint_rec IN
            SELECT conname, pg_get_constraintdef(c.oid) as constrainddef 
                FROM pg_constraint c 
                    WHERE conrelid=(
                        SELECT attrelid FROM pg_attribute
                        WHERE attrelid = (
                            SELECT oid FROM pg_class WHERE relname = table_rec.relname
                        ) AND attname='tableoid'
                    )
        LOOP
            v_table_ddl:=v_table_ddl||','||chr(10);
            v_table_ddl:=v_table_ddl||'CONSTRAINT '||constraint_rec.conname;
            v_table_ddl:=v_table_ddl||chr(10)||'    '||constraint_rec.constrainddef;
            firstrec := FALSE;
        END LOOP;
        v_table_ddl:=v_table_ddl||');';
        RETURN NEXT v_table_ddl;
    END LOOP;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.generate_create_table_statement(character varying)
  OWNER TO postgres;

Jetzt können Sie beispielsweise die folgende Abfrage durchführen

SELECT * FROM generate_create_table_statement('.*');

was zu folgenden Ergebnissen führt:

CREATE TABLE public.answer (                                                                        
     id integer DEFAULT nextval('answer_id_seq'::regclass) NOT NULL,                               
     questionid integer  NOT NULL,                                                                  
     title character varying  NOT NULL,                                                             
     defaultvalue character varying  NULL,                                                          
     valuetype integer  NOT NULL,                                                                   
     isdefault boolean  NULL,                                                                       
     minval double precision  NULL,                                                                 
     maxval double precision  NULL,                                                                 
     followminmax integer DEFAULT 0 NOT NULL,                                                       
CONSTRAINT answer_pkey                                                                              
     PRIMARY KEY (id),                                                                              
CONSTRAINT answer_questionid_fkey                                                                  
     FOREIGN KEY (questionid) REFERENCES question(id) ON UPDATE RESTRICT ON DELETE RESTRICT,       
CONSTRAINT answer_valuetype_fkey                                                                   
     FOREIGN KEY (valuetype) REFERENCES answervaluetype(id) ON UPDATE RESTRICT ON DELETE RESTRICT);

für jede Benutzertabelle.

vkkeeper
quelle
2
Dies funktioniert nur für Tabellen, die im öffentlichen Schema sind
Brad Mathews
13

Die einfachste Methode, die ich mir vorstellen kann, besteht darin, pgAdmin 3 ( hier zu finden ) zu installieren und damit Ihre Datenbank anzuzeigen. Es wird automatisch eine Abfrage generiert, die die betreffende Tabelle erstellt.

Corin
quelle
1
pgAdmin sieht gut aus, aber leider habe ich keinen Root-Zugriff, um auf dem Server zu installieren ..
Raja
11
Sie müssen es nicht auf dem Server installieren. Legen Sie es auf Ihren Desktop und verbinden Sie es mit dem Server.
Corin
8

Wenn Sie dies für verschiedene Tabellen gleichzeitig tun möchten, müssen Sie den Schalter -t mehrmals verwenden (ich habe eine Weile gebraucht, um herauszufinden, warum die durch Kommas getrennte Liste nicht funktioniert hat). Kann auch nützlich sein, um Ergebnisse an eine Outfile oder Pipe an einen Postgres-Server auf einem anderen Computer zu senden

pg_dump -t table1 -t table2 database_name --schema-only > dump.sql

pg_dump -t table1 -t table2 database_name --schema-only | psql -h server_name database_name
John Powell
quelle
5

Noch mehr Modifikationen basierend auf der Antwort von @vkkeeper. Möglichkeit hinzugefügt, Tabelle aus dem spezifischen Schema abzufragen.

CREATE OR REPLACE FUNCTION public.describe_table(p_schema_name character varying, p_table_name character varying)
  RETURNS SETOF text AS
$BODY$
DECLARE
    v_table_ddl   text;
    column_record record;
    table_rec record;
    constraint_rec record;
    firstrec boolean;
BEGIN
    FOR table_rec IN
        SELECT c.relname, c.oid FROM pg_catalog.pg_class c
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
                WHERE relkind = 'r'
                AND n.nspname = p_schema_name
                AND relname~ ('^('||p_table_name||')$')
          ORDER BY c.relname
    LOOP
        FOR column_record IN
            SELECT
                b.nspname as schema_name,
                b.relname as table_name,
                a.attname as column_name,
                pg_catalog.format_type(a.atttypid, a.atttypmod) as column_type,
                CASE WHEN
                    (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                     FROM pg_catalog.pg_attrdef d
                     WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN
                    'DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                                  FROM pg_catalog.pg_attrdef d
                                  WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
                ELSE
                    ''
                END as column_default_value,
                CASE WHEN a.attnotnull = true THEN
                    'NOT NULL'
                ELSE
                    'NULL'
                END as column_not_null,
                a.attnum as attnum,
                e.max_attnum as max_attnum
            FROM
                pg_catalog.pg_attribute a
                INNER JOIN
                 (SELECT c.oid,
                    n.nspname,
                    c.relname
                  FROM pg_catalog.pg_class c
                       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
                  WHERE c.oid = table_rec.oid
                  ORDER BY 2, 3) b
                ON a.attrelid = b.oid
                INNER JOIN
                 (SELECT
                      a.attrelid,
                      max(a.attnum) as max_attnum
                  FROM pg_catalog.pg_attribute a
                  WHERE a.attnum > 0
                    AND NOT a.attisdropped
                  GROUP BY a.attrelid) e
                ON a.attrelid=e.attrelid
            WHERE a.attnum > 0
              AND NOT a.attisdropped
            ORDER BY a.attnum
        LOOP
            IF column_record.attnum = 1 THEN
                v_table_ddl:='CREATE TABLE '||column_record.schema_name||'.'||column_record.table_name||' (';
            ELSE
                v_table_ddl:=v_table_ddl||',';
            END IF;

            IF column_record.attnum <= column_record.max_attnum THEN
                v_table_ddl:=v_table_ddl||chr(10)||
                         '    '||column_record.column_name||' '||column_record.column_type||' '||column_record.column_default_value||' '||column_record.column_not_null;
            END IF;
        END LOOP;

        firstrec := TRUE;
        FOR constraint_rec IN
            SELECT conname, pg_get_constraintdef(c.oid) as constrainddef
                FROM pg_constraint c
                    WHERE conrelid=(
                        SELECT attrelid FROM pg_attribute
                        WHERE attrelid = (
                            SELECT oid FROM pg_class WHERE relname = table_rec.relname
                                AND relnamespace = (SELECT ns.oid FROM pg_namespace ns WHERE ns.nspname = p_schema_name)
                        ) AND attname='tableoid'
                    )
        LOOP
            v_table_ddl:=v_table_ddl||','||chr(10);
            v_table_ddl:=v_table_ddl||'CONSTRAINT '||constraint_rec.conname;
            v_table_ddl:=v_table_ddl||chr(10)||'    '||constraint_rec.constrainddef;
            firstrec := FALSE;
        END LOOP;
        v_table_ddl:=v_table_ddl||');';
        RETURN NEXT v_table_ddl;
    END LOOP;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Andrey Lebedenko
quelle
4

Hier ist ein bisschen verbesserte Version von shekwi ‚s Abfrage .
Es generiert die Primärschlüsseleinschränkung und kann temporäre Tabellen verarbeiten:

with pkey as
(
    select cc.conrelid, format(E',
    constraint %I primary key(%s)', cc.conname,
        string_agg(a.attname, ', ' 
            order by array_position(cc.conkey, a.attnum))) pkey
    from pg_catalog.pg_constraint cc
        join pg_catalog.pg_class c on c.oid = cc.conrelid
        join pg_catalog.pg_attribute a on a.attrelid = cc.conrelid 
            and a.attnum = any(cc.conkey)
    where cc.contype = 'p'
    group by cc.conrelid, cc.conname
)
select format(E'create %stable %s%I\n(\n%s%s\n);\n',
    case c.relpersistence when 't' then 'temporary ' else '' end,
    case c.relpersistence when 't' then '' else n.nspname || '.' end,
    c.relname,
    string_agg(
        format(E'\t%I %s%s',
            a.attname,
            pg_catalog.format_type(a.atttypid, a.atttypmod),
            case when a.attnotnull then ' not null' else '' end
        ), E',\n'
        order by a.attnum
    ),
    (select pkey from pkey where pkey.conrelid = c.oid)) as sql
from pg_catalog.pg_class c
    join pg_catalog.pg_namespace n on n.oid = c.relnamespace
    join pg_catalog.pg_attribute a on a.attrelid = c.oid and a.attnum > 0
    join pg_catalog.pg_type t on a.atttypid = t.oid
where c.relname = :table_name
group by c.oid, c.relname, c.relpersistence, n.nspname;

Verwenden Sie den table_nameParameter, um den Namen der Tabelle anzugeben.

yallie
quelle
1
Beinhaltet PKs, behandelt jedoch keine STANDARD.
DKroot
3
pg_dump -h XXXXXXXXXXX.us-west-1.rds.amazonaws.com -U anyuser -t tablename -s
user3662456
quelle
3
Während dieses Code-Snippet die Frage lösen kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
DimaSan
2

Dies ist die Variante, die für mich funktioniert:

pg_dump -U user_viktor -h localhost unit_test_database -t floorplanpreferences_table --schema-only

Wenn Sie Schemas verwenden, müssen Sie natürlich auch Folgendes angeben:

pg_dump -U user_viktor -h localhost unit_test_database -t "949766e0-e81e-11e3-b325-1cc1de32fcb6".floorplanpreferences_table --schema-only

Sie erhalten eine Ausgabe, mit der Sie die Tabelle erneut erstellen können. Führen Sie diese Ausgabe einfach in psql aus.

Sandy Simonton
quelle
0

Eine einfache Lösung in reinem SQL. Wenn Sie auf die Idee kommen, können Sie sie auf weitere Attribute erweitern, die Sie anzeigen möchten.

with c as (
SELECT table_name, ordinal_position, 
 column_name|| ' ' || data_type col
, row_number() over (partition by table_name order by ordinal_position asc) rn
, count(*) over (partition by table_name) cnt
FROM information_schema.columns
WHERE table_name   in ('pg_index', 'pg_tables')
order by table_name, ordinal_position
)
select case when rn = 1 then 'create table ' || table_name || '(' else '' end
 || col 
 || case when rn < cnt then ',' else '); ' end
from c 
order by table_name, rn asc;

Ausgabe:

create table pg_index(indexrelid oid,
 indrelid oid,
 indnatts smallint,
 indisunique boolean,
 indisprimary boolean,
 indisexclusion boolean,
 indimmediate boolean,
 indisclustered boolean,
 indisvalid boolean,
 indcheckxmin boolean,
 indisready boolean,
 indislive boolean,
 indisreplident boolean,
 indkey ARRAY,
 indcollation ARRAY,
 indclass ARRAY,
 indoption ARRAY,
 indexprs pg_node_tree,
 indpred pg_node_tree);

 create table pg_tables(schemaname name,
 tablename name,
 tableowner name,
 tablespace name,
 hasindexes boolean,
 hasrules boolean,
 hastriggers boolean,
 rowsecurity boolean);
Charlie 木匠
quelle
* Behandelt nicht Tabellen mit demselben Namen in mehreren Schemas. * Enthält keine
Typlängen
0

Hier ist eine einzelne Anweisung, die die DDL für eine einzelne Tabelle in einem angegebenen Schema einschließlich Einschränkungen generiert.

SELECT 'CREATE TABLE ' || pn.nspname || '.' || pc.relname || E'(\n' ||
   string_agg(pa.attname || ' ' || pg_catalog.format_type(pa.atttypid, pa.atttypmod) || coalesce(' DEFAULT ' || (
                                                                                                               SELECT pg_catalog.pg_get_expr(d.adbin, d.adrelid)
                                                                                                               FROM pg_catalog.pg_attrdef d
                                                                                                               WHERE d.adrelid = pa.attrelid
                                                                                                                 AND d.adnum = pa.attnum
                                                                                                                 AND pa.atthasdef
                                                                                                               ),
                                                                                                 '') || ' ' ||
              CASE pa.attnotnull
                  WHEN TRUE THEN 'NOT NULL'
                  ELSE 'NULL'
              END, E',\n') ||
   coalesce((SELECT E',\n' || string_agg('CONSTRAINT ' || pc1.conname || ' ' || pg_get_constraintdef(pc1.oid), E',\n' ORDER BY pc1.conindid)
            FROM pg_constraint pc1
            WHERE pc1.conrelid = pa.attrelid), '') ||
   E');'
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pc
    ON pc.oid = pa.attrelid
    AND pc.relname = 'table_name'
JOIN pg_catalog.pg_namespace pn
    ON pn.oid = pc.relnamespace
    AND pn.nspname = 'schema_name'
WHERE pa.attnum > 0
    AND NOT pa.attisdropped
GROUP BY pn.nspname, pc.relname, pa.attrelid;
Phil Allen
quelle
-1

Klicken Sie in der pgadminIII-Datenbank >> Schemata >> Tabellen >> mit der rechten Maustaste auf 'Ihre Tabelle' >> Skripte >> 'Wählen Sie eine aus (Erstellen, Einfügen, Aktualisieren, Löschen ..)'

Siddappa Walake
quelle
-1

Hier ist eine Abfrage mit einigen Änderungen,

select 'CREATE TABLE ' || a.attrelid::regclass::text || '(' ||
string_agg(a.attname || ' ' || pg_catalog.format_type(a.atttypid, 
a.atttypmod)||
        CASE WHEN 
            (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
             FROM pg_catalog.pg_attrdef d
             WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN
            ' DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                          FROM pg_catalog.pg_attrdef d
                          WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
        ELSE
            '' END
||
        CASE WHEN a.attnotnull = true THEN 
            ' NOT NULL'
        ELSE
            '' END,E'\n,') || ');' 
FROM pg_catalog.pg_attribute a join pg_class on a.attrelid=pg_class.oid
WHERE a.attrelid::regclass::varchar =  
'TABLENAME_with_or_without_schema'
AND a.attnum > 0 AND NOT a.attisdropped  and pg_class.relkind='r'
group by a.attrelid;
Sagar Jadhav
quelle