在 Postgres 中是否有等效于 MySQL 的 SHOW CREATE TABLE?

vle*_*bar 102 mysql postgresql sql

SHOW CREATE TABLEPostgres 中是否有相当于 MySQL 的版本?这可能吗?如果不是,下一个最佳解决方案是什么?

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

alv*_*osu 66

pg_dump:

pg_dump -st tablename dbname
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么不?`--schema-only` 有这个确切的目的:显示创建模式/表的 SQL 语句。您可以以某种方式将此输出提供给您的 C# 程序。 (2认同)
  • @SvenW:如果我有一组已知的表格,我会这样做。问题是,如果用户选择同步所选数据库中的任何表,然后在 wcf 服务后面的远程服务器上创建所选表。我可以使用 mssql 做到这一点,现在我想将客户端程序扩展到其他 sql 服务器(mysql、oracle、postgresql,...) 好的,我可以为用户想要同步的表执行 pg_dump,但如果是完全可以在 plsql 中做到这一点,我想在 plsql 中做到这一点 (2认同)

小智 36

您可以尝试在 PostgreSQL 日志文件中跟踪pg_dump --table table --schema-only真正做了什么。然后就可以用同样的方法编写自己的sql函数了。

  • 无需遇到所有麻烦 - 根据[此处](https://gist.github.com/Kartones/dd3ff5ec5ea238d4c546),您可以使用“-E”选项来跟踪运行时后台发生的情况`psql` 命令 - `-E:将描述 \ 命令的底层查询(学习很酷!)` - HTH! (2认同)

小智 26

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

  • 这很有帮助,但没有回答问题。 (21认同)
  • 因为它很有帮助。:) +1 (5认同)
  • 不回答问题,不明白为什么这么多人赞成这个 (2认同)

Eog*_*anM 14

基于@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 ' || $1 || ' (' || $2 || '' || 
    string_agg(column_list.column_expr, ', ' || $2 || '') || 
    '' || $2 || ');'
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 = $1
  ORDER BY ordinal_position) column_list;
$BODY$
  LANGUAGE SQL STABLE;
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案 (4认同)

Cub*_*oft 10

我意识到我参加这个聚会有点晚了,但这是我的 Google 搜索的第一个结果,所以我想我会回答我的想法。

您可以通过此查询获得非常远的解决方案以获取列:

SELECT *
FROM information_schema.columns
WHERE table_schema = 'YOURSCHEMA' AND table_name = 'YOURTABLE'
ORDER BY ordinal_position;
Run Code Online (Sandbox Code Playgroud)

然后是对最常见索引的查询:

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
Run Code Online (Sandbox Code Playgroud)

然后就是以正确的格式构建查询字符串的问题。