PostgreSQL में मौजूदा तालिका के लिए "तालिका बनाएँ" sql कथन कैसे उत्पन्न करें


250

मैंने postgreSQL में एक टेबल बनाया है। मैं तालिका बनाने के लिए उपयोग किए गए SQL कथन को देखना चाहता हूं, लेकिन इसका पता नहीं लगा सकता।

मैं create tableकमांडलाइन या SQL स्टेटमेंट के माध्यम से पोस्टग्रेज में मौजूदा टेबल के लिए एसक्यूएल स्टेटमेंट कैसे प्राप्त करूं ?

जवाबों:


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

अधिक जानकारी - मैनुअल में


53
मुझे डेटाबेस भी बताना था। pg_dump mydb -t mytable --schema-only
निक नेव

1
@Milen A. Radev: कृपया dbname को शामिल करने के लिए उत्तर संपादित करें। मैंने 5 मिनट उस योग्य वाक्य रचना के बदलावों को आजमाने में बिताए (क्योंकि मैं डिफ़ॉल्ट डीबी का उपयोग नहीं कर रहा था)। धन्यवाद!
farthVader

1
मैं यह काम करने के लिए नहीं मिल सकता है, यह केवल कुछ भी नहीं उत्पादन होगा। PgAdminIII को डाउनलोड करने और मुझे दिखाने के लिए उनके टूल का उपयोग करने के लिए जख्मी करें। मुझे आश्चर्य है कि पोस्टग्रेज में डंप बनाने की आवश्यकता के बिना यह कार्यक्षमता नहीं है।
अमलगोविनस

5
aschemaउस तालिका के वास्तविक स्कीमा नाम से बदलें जिसे आप डंप करना चाहते हैं। atableउस तालिका के वास्तविक तालिका नाम से बदलें जिसे आप डंप करना चाहते हैं।
स्टीवेहा

6
यह काम करता है, लेकिन अगर टेबल के नाम में कोई अपरकेस अक्षर है तो आपको टेबल के नाम को सिंगल और डबल कोट्स दोनों से pg_dump mydb -t '"TableName"' --schema-onlyलपेटना होगा : - अन्यथा pg_dump टेबल के नाम को नहीं पहचानेगा।
जोश

81

मेरा समाधान इस प्रकार के साथ -E विकल्प के साथ psql का उपयोग करते हुए पोस्टग्रैब्स डीबी में लॉग इन करना है:

psql -E -U username -d database   

Psql में,
वर्णन तालिका विवरण उत्पन्न करने के लिए उपयोग किए जाने वाले sql को देखने के लिए निम्न आदेश चलाएँ :

-- 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  

इन विवरण कमांडों को चलाने के बाद बाहर निकाले गए sql के आधार पर, मैं
निम्नलिखित plpgsql फ़ंक्शन को एक साथ रखने में सक्षम था :

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;

यहां फ़ंक्शन का उपयोग किया गया है:

SELECT generate_create_table_statement('tablename');

और यहाँ ड्रॉप स्टेटमेंट है अगर आप इस फंक्शन को स्थायी रूप से जारी नहीं रखना चाहते हैं:

DROP FUNCTION generate_create_table_statement(p_table_name varchar);

2
अच्छा, मैं एक plpgsql-way की तलाश में था। LOOP हिस्सा थोड़ा टूटा हुआ है, हालांकि, यह पहले कॉलम को दो बार और अंतिम कॉलम को छोड़ देता है। मैंने इसे ठीक करने के लिए पोस्ट को एडिट किया है।
वेबमुट

बहुत उपयोगी के रूप में यह भी आप विचारों के लिए एक टेबल स्टेटमेंट बनाने की अनुमति देता है :)
वोल्फ

"इन डिस्क्रिप्शन कमांड को चलाने के बाद बाहर निकाले गए sql पर आधारित है" - मुझे कोई sql आउटपुट नहीं दिखता है। केवल स्तंभ वर्णनकर्ता। क्या मैं कुछ भूल रहा हूँ?
इकिस

Generate_create_table_statement ('my_table') का उपयोग करने से तर्क प्रकार का बेमेल परिणाम होता है। 'कॉलम "my_table" में उद्धरण परिणाम के बिना generate_create_table_statement (my_table) का उपयोग करना मौजूद नहीं है। अनुमान एक psql संस्करण पर निर्भर मुद्दा है। कोई विचार?
जेसन मॉर्गन

दुर्भाग्य से, यह फ़ंक्शन केवल NULLमेरे लिए लौटता है ... और स्कीमा को कैसे संभाला जाता है? क्या इसे सभी स्कीमाओं से निर्दिष्ट नाम के साथ तालिकाओं के लिए कथन बनाना चाहिए?
मथायस सैमसल

39

Linux कमांडलाइन से postgresql में तालिका के लिए तालिका विवरण बनाएँ:

यह कथन मेरे लिए तालिका बनाएँ sql कथन को आउटपुट करता है:

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

स्पष्टीकरण:

pg_dump हमें डेटाबेस के बारे में जानकारी प्राप्त करने में मदद करता है। -Uउपयोगकर्ता नाम के लिए खड़ा है। मेरे pgadmin उपयोगकर्ता का कोई पासवर्ड सेट नहीं है, इसलिए मुझे पासवर्ड डालने की आवश्यकता नहीं है। -tविकल्प का मतलब है एक मेज के लिए निर्दिष्ट करें। --schema-onlyमतलब टेबल के बारे में केवल डेटा प्रिंट करें, और टेबल में डेटा नहीं। यहाँ सटीक कमांड का उपयोग किया गया है:

pg_dump -U pgadmin kurz_prod -t fact_stock_info --schema-only

27

यदि आप pg_dump का उपयोग किए बिना किसी तालिका के लिए बनावटी कथन ढूंढना चाहते हैं, तो यह क्वेरी आपके लिए काम कर सकती है (जो भी आपकी तालिका कहलाती है, उसके साथ with tablename ’बदलें):

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;

जब psql से सीधे कॉल किया जाता है, तो यह करना उपयोगी है:

\pset linestyle old-ascii

साथ ही, इस थ्रेड में फ़ंक्शन generate_create_table_statement बहुत अच्छी तरह से काम करता है।


जिज्ञासा से बाहर, आप केवल pg_dump का उपयोग करने के बजाय ऐसा क्यों करना चाहेंगे?
क्रिस्टोफर रीड

7
नमस्ते। मेरा उपयोग यह था कि मेरे पास डेटाबेस तक पहुंच थी, लेकिन शेल नहीं था। Pg_dump को चलाने के लिए आवश्यक है कि आपके पास एक सिस्टम उपयोगकर्ता हो।
shekwi

हां, हालांकि यह उन अनुमतियों और बाधाओं का उत्पादन नहीं करता है, जिन्हें मैं अंत में देखता हूं pg_dump। उपयोगी सभी समान +1
ईकिस

1
विशेष रूप से MySQL से आने वाले उन लोगों के लिए शानदार बिट कोड, जो SHOW CREATE TABLE table_name का उपयोग करते हैं। इसके अतिरिक्त, मैं एक डेटाबेस को सीमित अनुमतियों के साथ एक्सेस कर रहा हूं, इसलिए यह सही है।
एरिक पी

1
अच्छा लगा, लेकिन इसमें DEFAULT मान शामिल नहीं हैं।
dland

17

डीन टॉडर बस उत्कृष्ट! मैंने आपके कोड को थोड़ा संशोधित किया, तालिका में सभी बाधाओं को दिखाने के लिए और तालिका नाम में regexp मास्क का उपयोग करना संभव बनाने के लिए।

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;

अब, उदाहरण के लिए, आप निम्नलिखित क्वेरी कर सकते हैं

SELECT * FROM generate_create_table_statement('.*');

इस तरह के परिणाम:

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);

प्रत्येक उपयोगकर्ता तालिका के लिए।


2
यह केवल उन टेबल के लिए काम करता है जो सार्वजनिक स्कीमा में हैं
ब्रैड मैथ्यूज

13

सबसे आसान तरीका जो मैं सोच सकता हूं वह है pgAdmin 3 को स्थापित करना ( यहां पाया गया ) और इसका उपयोग अपने डेटाबेस को देखने के लिए करें। यह स्वचालित रूप से एक क्वेरी उत्पन्न करेगा जो प्रश्न में तालिका बनाएगा।


1
pgAdmin अच्छा लग रहा है, लेकिन दुर्भाग्य से मेरे पास सर्वर पर स्थापित करने के लिए रूट एक्सेस नहीं है ..
राजा

11
आपको इसे सर्वर पर स्थापित करने की आवश्यकता नहीं है। इसे अपने डेस्कटॉप पर रखें और फिर इसे सर्वर से कनेक्ट करें।
कॉरिन

8

यदि आप एक ही बार में विभिन्न तालिकाओं के लिए ऐसा करना चाहते हैं, तो आपने -t स्विच को कई बार उपयोग करने की अनुमति दी है (मुझे यह पता लगाने में थोड़ा समय लग गया कि अल्पविराम से अलग की गई सूची काम नहीं कर रही थी)। इसके अलावा, किसी मशीन पर पोस्टग्रेज सर्वर को आउटफिट या पाइप पर परिणाम भेजने के लिए उपयोगी हो सकता है

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

5

@Vkkeeper की प्रतिक्रिया के आधार पर और भी अधिक संशोधन। विशिष्ट स्कीमा से क्वेरी तालिका में संभावना जोड़ा गया।

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;

4

यहाँ shekwi की क्वेरी का थोड़ा सुधार हुआ संस्करण है ।
यह प्राथमिक कुंजी बाधा उत्पन्न करता है और अस्थायी तालिकाओं को संभालने में सक्षम है:

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;

table_nameतालिका का नाम निर्दिष्ट करने के लिए पैरामीटर का उपयोग करें ।


1
पीके शामिल है, लेकिन DEFAULTs को संभालता नहीं है।
डीकरोट

3
pg_dump -h XXXXXXXXXXX.us-west-1.rds.amazonaws.com -U anyuser -t tablename -s

3
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
दिनासन

2

यह वह भिन्नता है जो मेरे लिए काम करती है:

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

इसके अतिरिक्त, यदि आप स्कीमा का उपयोग कर रहे हैं, तो आपको निश्चित रूप से यह भी निर्दिष्ट करना होगा:

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

आपको एक आउटपुट मिलेगा जिसे आप टेबल को फिर से बनाने के लिए उपयोग कर सकते हैं, बस उस आउटपुट को psql में चलाएं।


0

शुद्ध एकल एसक्यूएल में एक सरल समाधान। आपको यह विचार मिलता है, आप इसे और अधिक विशेषताओं में विस्तारित कर सकते हैं जिन्हें आप दिखाना चाहते हैं।

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;

आउटपुट:

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);

* मल्टीपल स्कीमा में एक ही नाम वाली टेबल को हैंडल नहीं करता है * इसमें टाइप की लंबाई शामिल नहीं है
DKroot

0

यहाँ एक एकल कथन है जो एक निर्दिष्ट स्कीमा में एक तालिका के लिए DDL उत्पन्न करेगा, जिसमें अड़चनें शामिल हैं।

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;

0

उल्लिखित अन्य उत्तरों की तरह, ऐसा कोई फ़ंक्शन नहीं है जो ऐसा करता हो।

यहां एक फ़ंक्शन है जो तालिका को दोहराने के लिए आवश्यक सभी जानकारी प्राप्त करने का प्रयास करता है - या ddl में तैनात और जाँच की तुलना करने के लिए।

यह फ़ंक्शन आउटपुट:

  • कॉलम (w / परिशुद्धता, null / not-null, डिफ़ॉल्ट मान)
  • की कमी
  • अनुक्रमणिका

CREATE OR REPLACE FUNCTION public.show_create_table(
  in_schema_name varchar,
  in_table_name varchar
)
RETURNS text
LANGUAGE plpgsql VOLATILE
AS
$$
  DECLARE
    -- the ddl we're building
    v_table_ddl text;

    -- data about the target table
    v_table_oid int;

    -- records for looping
    v_column_record record;
    v_constraint_record record;
    v_index_record record;
  BEGIN
    -- grab the oid of the table; https://www.postgresql.org/docs/8.3/catalog-pg-class.html
    SELECT c.oid INTO v_table_oid
    FROM pg_catalog.pg_class c
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE 1=1
      AND c.relkind = 'r' -- r = ordinary table; https://www.postgresql.org/docs/9.3/catalog-pg-class.html
      AND c.relname = in_table_name -- the table name
      AND n.nspname = in_schema_name; -- the schema

    -- throw an error if table was not found
    IF (v_table_oid IS NULL) THEN
      RAISE EXCEPTION 'table does not exist';
    END IF;

    -- start the create definition
    v_table_ddl := 'CREATE TABLE ' || in_schema_name || '.' || in_table_name || ' (' || E'\n';

    -- define all of the columns in the table; https://stackoverflow.com/a/8153081/3068233
    FOR v_column_record IN
      SELECT
        c.column_name,
        c.data_type,
        c.character_maximum_length,
        c.is_nullable,
        c.column_default
      FROM information_schema.columns c
      WHERE (table_schema, table_name) = (in_schema_name, in_table_name)
      ORDER BY ordinal_position
    LOOP
      v_table_ddl := v_table_ddl || '  ' -- note: two char spacer to start, to indent the column
        || v_column_record.column_name || ' '
        || v_column_record.data_type || CASE WHEN v_column_record.character_maximum_length IS NOT NULL THEN ('(' || v_column_record.character_maximum_length || ')') ELSE '' END || ' '
        || CASE WHEN v_column_record.is_nullable = 'NO' THEN 'NOT NULL' ELSE 'NULL' END
        || CASE WHEN v_column_record.column_default IS NOT null THEN (' DEFAULT ' || v_column_record.column_default) ELSE '' END
        || ',' || E'\n';
    END LOOP;

    -- define all the constraints in the; https://www.postgresql.org/docs/9.1/catalog-pg-constraint.html && https://dba.stackexchange.com/a/214877/75296
    FOR v_constraint_record IN
      SELECT
        con.conname as constraint_name,
        con.contype as constraint_type,
        CASE
          WHEN con.contype = 'p' THEN 1 -- primary key constraint
          WHEN con.contype = 'u' THEN 2 -- unique constraint
          WHEN con.contype = 'f' THEN 3 -- foreign key constraint
          WHEN con.contype = 'c' THEN 4
          ELSE 5
        END as type_rank,
        pg_get_constraintdef(con.oid) as constraint_definition
      FROM pg_catalog.pg_constraint con
      JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid
      JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace
      WHERE nsp.nspname = in_schema_name
      AND rel.relname = in_table_name
      ORDER BY type_rank
    LOOP
      v_table_ddl := v_table_ddl || '  ' -- note: two char spacer to start, to indent the column
        || 'CONSTRAINT' || ' '
        || v_constraint_record.constraint_name || ' '
        || v_constraint_record.constraint_definition
        || ',' || E'\n';
    END LOOP;

    -- drop the last comma before ending the create statement
    v_table_ddl = substr(v_table_ddl, 0, length(v_table_ddl) - 1) || E'\n';

    -- end the create definition
    v_table_ddl := v_table_ddl || ');' || E'\n';

    -- suffix create statement with all of the indexes on the table
    FOR v_index_record IN
      SELECT indexdef
      FROM pg_indexes
      WHERE (schemaname, tablename) = (in_schema_name, in_table_name)
    LOOP
      v_table_ddl := v_table_ddl
        || v_index_record.indexdef
        || ';' || E'\n';
    END LOOP;

    -- return the ddl
    RETURN v_table_ddl;
  END;
$$;

उदाहरण

SELECT * FROM public.show_create_table('public', 'example_table');

पैदा करता है

CREATE TABLE public.example_table (
  id bigint NOT NULL DEFAULT nextval('test_tb_for_show_create_on_id_seq'::regclass),
  name character varying(150) NULL,
  level character varying(50) NULL,
  description text NOT NULL DEFAULT 'hello there!'::text,
  CONSTRAINT test_tb_for_show_create_on_pkey PRIMARY KEY (id),
  CONSTRAINT test_tb_for_show_create_on_level_check CHECK (((level)::text = ANY ((ARRAY['info'::character varying, 'warn'::character varying, 'error'::character varying])::text[])))
);
CREATE UNIQUE INDEX test_tb_for_show_create_on_pkey ON public.test_tb_for_show_create_on USING btree (id);

-1

PgadminIII डेटाबेस में >> स्कीमा >> टेबल >> 'अपनी टेबल' पर राइट क्लिक करें >> स्क्रिप्ट >> 'किसी एक को सेलेक्ट करें (क्रिएट, इंसर्ट, अपडेट, डिलीट ..)


-1

यहाँ कुछ संपादन के साथ एक प्रश्न है,

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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.