我有一个在postgreSQL中创建的表。我想看看用于创建表的sql语句,但无法弄清楚。如何在postgreSQL中为现有表生成“create table”sql语句
我如何通过命令行或SQL语句得到PostgreSQL中现有的表“创建表” sql语句?
我有一个在postgreSQL中创建的表。我想看看用于创建表的sql语句,但无法弄清楚。如何在postgreSQL中为现有表生成“create table”sql语句
我如何通过命令行或SQL语句得到PostgreSQL中现有的表“创建表” sql语句?
pg_dump -t 'aschema.atable' --schema-only database-name
更多信息。 - 在manual
我能想到的最简单的方法是安装pgAdmin的3(found here),并用它来查看您的数据库时,它将自动生成一个查询,将讨论创建表
生成创建表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
我的解决办法是登录到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);
如果你想在一次各种表格做到这一点,你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
这对结果的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中运行该输出即可。
如果你想找到一个表的创建语句中不使用的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在这个线程工作得非常好。
出于好奇,你为什么要这样做而不是仅仅使用pg_dump? – AllTheTime 2016-01-19 00:59:37
嗨。我的用例是我可以访问数据库,但不是shell。运行pg_dump需要你有一个系统用户。 – shekwi 2016-01-19 11:13:14
是的,但是这不会产生我在'pg_dump'结尾看到的权限和约束。非常有用+1 – ekkis 2016-05-02 23:37:14
这是shekwi的query的改进版本。
它生成主键约束,能够处理临时表:
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
参数指定表的名称。
pg_dump -h XXXXXXXXXXX.us-west-1.rds.amazonaws.com -U anyuser -t tablename -s
虽然此代码片段可能会解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 – DimaSan 2017-03-18 01:37:57
在pgadminIII数据库>> >>模式>>表右键单击 '你的表' >>脚本>> '选择任意一个(创建,插入,更新,删除..)'
下面是一些编辑查询,
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;
我也必须指定数据库。 'pg_dump mydb -t mytable --schema-only'。 – Nic 2013-11-04 05:31:02
@Milen A. Radev:请编辑答案以包含dbname。我花了5分钟尝试了该合格syntaxt的变体(因为我没有使用默认数据库)。谢谢! – farthVader 2015-01-27 02:30:15
我无法得到这个工作,它只会输出任何东西。伤了下载pgAdminIII并使用他们的工具为我展示创作。我很惊讶postgres没有这个功能,不需要转储。 – Amalgovinus 2015-04-23 21:02:00