在Postgres中是否有MySQL的SHOW CREATE TABLE的等效项?这可能吗?如果不是第二个最佳解决方案,那是什么?

我需要该语句,因为我使用它在远程服务器(通过WCF)上创建表。

#1 楼

您可以尝试在PostgreSQL日志文件中跟踪“ pg_dump -t table -s”的实际作用。然后,您可以使用相同的方法编写自己的sql函数。

评论


好的,我跟踪了pg_dump。但这并不是那么容易,因为我不得不用C#编写自己的函数来编写create table语句。但这是很大的帮助,非常感谢veeeeerrrryyyyy。 :D

–vlebar
2011-2-9在7:41

无需解决所有麻烦-根据这里,您可以使用-E选项来跟踪运行psql命令时后台发生的情况--E:将描述\命令的底层查询(学习很酷) !)-HTH!

–Vérace
19-10-4在13:38

#2 楼

pg_dump:

pg_dump -st tablename dbname


或使用PostgreSQL GUI工具(pgAdmin,phpPgAdmin等)

评论


我将尝试更详细地解释问题。我需要sql语句(选择或存储过程),因为我在C#中执行了sql命令(NpgsqlCommand)。所以我认为pg_dump在这种情况下不是解决方案。 :(

–vlebar
2011年2月6日22:00



为什么不? --schema-only具有此确切目的:显示SQL语句以创建架构/表。然后,您可以通过某种方式将此输出输入到C#程序中。

– Sven
2011年2月6日在22:10

查看information_schema视图:postgresql.org/docs/9.0/interactive/information-schema.html

– alvosu
2011年2月6日在22:12



@SvenW:如果我有一组已知的表,我会这样做。问题在于,用户可以选择同步选定数据库中的任何表,然后在wcf服务后面的远程服务器上创建选定表。我可以使用mssql做到这一点,现在我想将客户端程序扩展到其他sql服务器(mysql,oracle,postgresql等)。好了,我可以为用户要同步的表执行pg_dump,但如果是完全有可能在plsql中做到这一点,我想在plsql中做到这一点

–vlebar
2011年2月6日在22:36

如果转储到.tar,请从存档中获取restore.sql文件。它具有所有create语句。

–约瑟夫·欲望
17年3月17日在10:45

#3 楼

在命令行(psql)中,可以运行:\d <table name>列出所有列,它们的类型和索引。

评论


这是有帮助的,但不能回答问题。

–ryantuck
18年7月13日在16:21

问题是不同的。

– Ivailo Bardarov
20-04-27在18:27

无法回答问题,也无法理解为什么这么多人对此表示反对

–法雷
20年12月8日,2:01

#4 楼

在@CubicalSoft答案的第一部分的基础上,您可以添加以下功能,该功能应适用于简单表(假定默认为“公共”架构,并且省略了约束,索引和用户定义的数据类型等)。 @RJS答案是目前正确解决此问题的唯一方法;这是应该内置到psql中的东西!

CREATE OR REPLACE FUNCTION show_create_table(table_name text, join_char text = E'\n' ) 
  RETURNS text AS 
$BODY$
SELECT 'CREATE TABLE ' ||  || ' (' ||  || '' || 
    string_agg(column_list.column_expr, ', ' ||  || '') || 
    '' ||  || ');'
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 = 
  ORDER BY ordinal_position) column_list;
$BODY$
  LANGUAGE SQL STABLE;


评论


这应该是公认的答案

– exebook
19年1月7日,9:25



这次真是万分感谢!

–坦率
19年6月13日在4:16

EoghanM,太好了。谢谢!

– Eric M
19年11月30日在20:22

#5 楼

我知道我参加这次聚会有点晚了,但这是我的Google搜索的第一个结果,因此我想我可以对我的想法做出回答。

此查询的解决方案以获取列:

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


,然后此查询获取最常见的索引:

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


那么就可以用正确的格式构建查询字符串了。

#6 楼

正如在https://serverfault.com/a/875414/333439中回答的那样,使用\d <table>中的psql元命令可以显示数据库中的表结构。如果要查看在meta命令中使用的查询,可以使用命令psql -E。如手册中所述,-E开关回显\d元命令查询。因此,您可以启动psql -E,可以使用\d <table>元命令查看表结构,并根据-E开关,可以查看生成的用于描述表结构的查询

评论


我可以看到用于显示“ \ d表”输出的SQL命令,但是看不到用于创建表的SQL语句。

– Ivailo Bardarov
20/04/27在18:34

#7 楼

Postgres扩展ddlx(https://github.com/lacanoid/pgddl)可以做到这一点以及更多。

#8 楼

在pgAdmin 4中,只需在左侧树中找到该表,例如:

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


选择该表后,打开右侧的SQL选项卡。它显示所选表的CREATE TABLE