2010-04-07 66 views

回答

222
pg_dump -t 'aschema.atable' --schema-only database-name 

更多信息。 - 在manual

+35

我也必須指定數據庫。 'pg_dump mydb -t mytable --schema-only'。 – Nic 2013-11-04 05:31:02

+1

@Milen A. Radev:請編輯答案以包含dbname。我花了5分鐘嘗試了該合格syntaxt的變體(因爲我沒有使用默認數據庫)。謝謝! – farthVader 2015-01-27 02:30:15

+1

我無法得到這個工作,它只會輸出任何東西。傷了下載pgAdminIII並使用他們的工具爲我展示創作。我很驚訝postgres沒有這個功能,不需要轉儲。 – Amalgovinus 2015-04-23 21:02:00

8

我能想到的最簡單的方法是安裝pgAdmin的3(found here),並用它來查看您的數據庫時,它將自動生成一個查詢,將討論創建表

+0

pgAdmin的看起來不錯,但不幸的是我沒有root權限在服務器上安裝.. – Raja 2010-04-07 19:41:56

+7

你並不需要在服務器上安裝它。把它放在桌面上,然後連接到服務器。 – Corin 2010-04-07 19:53:46

30

生成創建表statem。耳鼻喉科的表中的PostgreSQL從Linux命令行:

本聲明輸出表爲我創建的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 
51

我的解決辦法是登錄到Postgres的數據庫使用PSQL與-E選項如下:

psql -E -U username -d database 

在psql裏,運行以下命令看到的Postgres的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呼應這些描述comman DS,我能夠放在一起
以下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); 
+1

不錯,我正在尋找plpgsql方式。LOOP部分雖然有點破,但它會生成第一列兩次並跳過最後一列。我編輯了這個帖子來解決這個問題。 – Webmut 2014-05-25 20:06:07

+0

非常有用,因爲這也允許您爲視圖創建表語句:) – Wolph 2014-09-20 13:16:35

+0

「基於運行這些describe命令後回顯出的sql」 - 我沒有看到任何sql輸出。只有列描述符。我錯過了什麼嗎? – ekkis 2016-05-03 22:02:32

6

如果你想在一次各種表格做到這一點,你MEED使用了-t開關多次(我花了一段ŧ o找出爲什麼逗號分隔列表不工作)。此外,可能是有用的另送機

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 
2

這對結果的OUTFILE或管道的Postgres的服務器是對我的作品的變化:

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中運行該輸出即可。

15

如果你想找到一個表的創建語句中不使用的pg_dump,該查詢可能會爲你工作(其他城市「表名」以您的表稱爲):

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直接調用,它是usefult做:

\pset linestyle old-ascii 

此外,功能generate_create_table_statement在這個線程工作得非常好。

+0

出於好奇,你爲什麼要這樣做而不是僅僅使用pg_dump? – AllTheTime 2016-01-19 00:59:37

+5

嗨。我的用例是我可以訪問數據庫,但不是shell。運行pg_dump需要你有一個系統用戶。 – shekwi 2016-01-19 11:13:14

+0

是的,但是這不會產生我在'pg_dump'結尾看到的權限和約束。非常有用+1 – ekkis 2016-05-02 23:37:14

0

這是shekwiquery的改進版本。
它生成主鍵約束,能夠處理臨時表:

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參數指定表的名稱。

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

雖然此代碼片段可能會解決問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – DimaSan 2017-03-18 01:37:57

0

在pgadminIII數據庫>> >>模式>>表右鍵單擊 '你的表' >>腳本>> '選擇任意一個(創建,插入,更新,刪除..)'

0

下面是一些編輯查詢,

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; 
相關問題