暂无图片
pg如何查看某个表的建表语句,类似 show create table t 这样
我来答
分享
暂无图片 匿名用户
pg如何查看某个表的建表语句,类似 show create table t 这样

pg如何查看某个表的建表语句,类似 show create table t 这样

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
清风生

pg没有类似语句,可以采用以下方法替代:

1. pg_dump -s -t

2. 自定义函数获取建表DDL,可参考:https://github.com/MichaelDBA/pg_get_tabledef/tree/main

示例:

-- 获取建表DDL,适用pg12及以上版本
-- DDL语句没有主键、唯一约束、索引、check约束,有not null约束,default值,序列;表有with存储参数
CREATE OR REPLACE FUNCTION ddl_versioning_get_tabledef(oid) RETURNS text
LANGUAGE sql STRICT AS $$
WITH attrdef AS (
SELECT
n.nspname,
c.relname,
pg_catalog.array_to_string(c.reloptions || array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ') as relopts,
c.relpersistence,
a.attnum,
a.attname,
pg_catalog.format_type(a.atttypid, a.atttypmod) as atttype,
(SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid, true) for 128) FROM pg_catalog.pg_attrdef d
WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) as attdefault,
a.attnotnull,
(SELECT c.collname FROM pg_catalog.pg_collation c, pg_catalog.pg_type t
WHERE c.oid = a.attcollation AND t.oid = a.atttypid AND a.attcollation <> t.typcollation) as attcollation,
a.attidentity
,a.attgenerated --pg12系统表新增字段pg_attribute.attgenerated,pg11及以下版本注释掉该行
FROM pg_catalog.pg_attribute a
JOIN pg_catalog.pg_class c ON a.attrelid = c.oid
JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid
LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)
WHERE a.attrelid = $1
AND a.attnum > 0
AND NOT a.attisdropped
ORDER BY a.attnum
),
coldef AS (
SELECT
attrdef.nspname,
attrdef.relname,
attrdef.relopts,
attrdef.relpersistence,
pg_catalog.format(
'%I %s%s%s%s%s',
attrdef.attname,
attrdef.atttype,
case when attrdef.attcollation is null then '' else pg_catalog.format(' COLLATE %I', attrdef.attcollation) end,
case when attrdef.attnotnull then ' NOT NULL' else '' end,
case when attrdef.attdefault is null then ''
else case when attrdef.attgenerated = 's' then pg_catalog.format(' GENERATED ALWAYS AS (%s) STORED', attrdef.attdefault) --pg12系统表新增字段pg_attribute.attgenerated,pg11及以下版本注释掉该行
when attrdef.attgenerated <> '' then ' GENERATED AS NOT_IMPLEMENTED' --pg12系统表新增字段pg_attribute.attgenerated,pg11及以下版本注释掉该行
else pg_catalog.format(' DEFAULT %s', attrdef.attdefault)
end --pg12系统表新增字段pg_attribute.attgenerated,pg11及以下版本注释掉该行
end,
case when attrdef.attidentity<>'' then pg_catalog.format(' GENERATED %s AS IDENTITY',
case attrdef.attidentity when 'd' then 'BY DEFAULT' when 'a' then 'ALWAYS' else 'NOT_IMPLEMENTED' end)
else '' end
) as col_create_sql
FROM attrdef
ORDER BY attrdef.attnum
),
tabdef AS (
SELECT
coldef.nspname,
coldef.relname,
coldef.relopts,
coldef.relpersistence,
string_agg(coldef.col_create_sql, E',\n ') as cols_create_sql
FROM coldef
GROUP BY
coldef.nspname, coldef.relname, coldef.relopts, coldef.relpersistence
)
SELECT
format(
'CREATE%s TABLE %I.%I%s%s%s;',
case tabdef.relpersistence when 't' then ' TEMP' when 'u' then ' UNLOGGED' else '' end,
tabdef.nspname,
tabdef.relname,
coalesce(
(SELECT format(E'\n PARTITION OF %I.%I %s\n', pn.nspname, pc.relname,
pg_get_expr(c.relpartbound, c.oid))
FROM pg_class c JOIN pg_inherits i ON c.oid = i.inhrelid
JOIN pg_class pc ON pc.oid = i.inhparent
JOIN pg_namespace pn ON pn.oid = pc.relnamespace
WHERE c.oid = $1),
format(E' (\n %s\n)', tabdef.cols_create_sql)
),
case when tabdef.relopts <> '' then format(' WITH (%s)', tabdef.relopts) else '' end,
coalesce(E'\nPARTITION BY '||pg_get_partkeydef($1), '')
) as table_create_sql
FROM tabdef
$$;

暂无图片 评论
暂无图片 有用 3
打赏 0
小鲁菜
暂无图片

\d 表名

\dt+ 表名

pg_dump -U 用户名 -d 数据库名 -t 表名 -s

eg:

postgres=# create table xx1(i int not null );
CREATE TABLE
postgres=# \d xx1
Table "public.xx1"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
i | integer | | not null |

postgres=# \dt+ xx1
List of relations
Schema | Name | Type | Owner | Persistence | Access method | Size | Descript
ion
--------+------+-------+----------+-------------+---------------+---------+---------
----
public | xx1 | table | postgres | permanent | heap | 0 bytes |
(1 row)

postgres=# \q
[postgres@halo125 ~]$ pg_dump -U postgres -d postgres -t xx1 -s
--

CREATE TABLE public.xx1 (
i integer NOT NULL
);


ALTER TABLE public.xx1 OWNER TO postgres;

--

暂无图片 评论
暂无图片 有用 1
打赏 0
Maleah

还有个函数pg_get_tabledef()

暂无图片 评论
暂无图片 有用 0
打赏 0
龙镇君

在 PostgreSQL 中,没有直接类似于 MySQL 的 SHOW CREATE TABLE 命令来查看某个表的建表语句。但是,你可以通过查询 PostgreSQL 的系统目录或使用一些工具来间接获取这些信息。

方法 1: 使用 \d+ 表名 在 psql 命令行工具中

如果你正在使用 psql(PostgreSQL 的命令行工具),你可以使用 \d+ 表名 命令来获取关于表的详细信息,包括列定义、索引、约束等。虽然这不会直接给出 SQL 建表语句,但它提供了足够的信息来手动重构它。

方法 2: 使用 pg_dump

另一个选项是使用 pg_dump 工具,它是 PostgreSQL 自带的一个用于备份数据库的工具。你可以使用它来导出特定表的 SQL 定义,包括建表语句。

例如,要导出名为 your_table 的表的建表语句,你可以使用以下命令:

pg_dump -U 用户名 -d 数据库名 -t your_table --schema-only

这个命令会输出包含 your_table 建表语句的 SQL 脚本,但不会包括数据。

方法 3: 查询系统目录

PostgreSQL 的系统目录(如 information_schema 和 pg_catalog)包含了关于数据库结构的信息。你可以通过查询这些目录来手动构建建表语句。

例如,以下 SQL 查询可以获取表的基本结构(列名、数据类型等):

SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_name = 'your_table' AND table_schema = 'public';

但是,请注意,这种方法需要你手动处理索引、约束等其他表元素。

方法 4: 使用第三方工具

还有一些第三方工具(如 DBeaver、pgAdmin 等)提供了图形界面来查看和导出表的建表语句。这些工具通常通过查询系统目录并格式化输出来实现这一功能,但它们为用户提供了更友好的界面。

结论

虽然 PostgreSQL 没有直接类似于 MySQL 的 SHOW CREATE TABLE 命令,但你可以通过上述方法中的任何一种来获取或重建表的建表语句。对于大多数情况,使用 pg_dump 或第三方工具是最简单且最直接的方法。

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
plsql下面的search text无法输入任何内容,是什么原因?
回答 1
是不是你当前连接的用户没有任何对象是一个空用户呢?
postgresql的 archive怎么清理?
回答 1
SELECTpgcancelbackend(PID);SELECTpgterminatebackend(PID);
postgreSQL 集群有分布式的吗?
回答 1
可以哟过Citus实现分布式PostgreSQL集群,参考https://blog.csdn.net/occ/article/details/123650859
业务负载并不高,该怎么加速我的PostgreSQL数据库实例?请问我的PostgreSQL实例陆续接收了一千多个活跃连接,随着连接增加系统越来越慢了,但是业务负载并不高,该怎么加速我的PostgreSQL数据库实例?
回答 2
已采纳
这个问题适用其他数据库。但是这里你确定你的会话都是活跃?如果都是活跃,那你的CPU应用很忙。你是不是说的是会话在连接但是是休眠?非活跃?一般来说我们的数据库库TPS和QPS都不会过万。在这个基础上,活
sys_rman如何查看命令的参数?
回答 1
./sysrmanhelp参考:pgbackrest2.27
关于内存统计方面--pg
回答 1
PostgreSQL没有类似MySQL的sys.memoryglobaltotal视图,可通过以下几种方式间接了解内存情况:通过pgstatactivity、pgstatbgwriter、pgstat
PostgreSQL怎么引用一个表的数据类型, 直接创建一个新的数据类型?
回答 2
表本身也是一个数据类型,可以直接使用
postgreSQL 下面如何根据年月日,但不使用age函数计算年龄?
回答 1
SELECT(datetrunc('year',currentdate)datetrunc('year',datecolumn)CASEWHENdatecolumn&gt;currentdateint
postgresql create index concurrently会对运行中的数据库产生影响吗?
回答 1
已采纳
这种方式上的是ShareUpdateExclusiveLock,不会阻塞DML操作。创建索引时候指定concurrently,需要先后两次对表全表扫描完成build,第一次扫描创建索引,不阻塞读写,第
oracle和pg中,在循环日志下,日志文件系统满了后,会有啥结果??
回答 1
会hung.等待日志归档。
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~