首页 > 数据库 >PostgreSQL查看表结构语句

PostgreSQL查看表结构语句

时间:2022-11-05 16:32:56浏览次数:76  
标签:语句 PostgreSQL 查看 oid when attrdef catalog pg coldef

参考​​https://www.modb.pro/db/60164​


在PG里面查看表结构,不如mysql那样show create table xx 这样方便。 

在PG里面常用如下3种方法:


第一种,最朴实的方法就是 pg_dump  --schema-only   导出全部的表结构

第二种,创建一个function,具体如下:

CREATE OR REPLACE FUNCTION tabledef(text,text) RETURNS text
LANGUAGE sql STRICT AS
$$
WITH attrdef AS (
SELECT n.nspname, c.relname, c.oid, 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
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 n.nspname = $1 AND c.relname = $2 AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
), coldef AS (
SELECT attrdef.nspname, attrdef.relname, attrdef.oid, 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) when attrdef.attgenerated <> '' then ' GENERATED AS NOT_IMPLEMENTED' else pg_catalog.format(' DEFAULT %s', attrdef.attdefault) end 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.oid, coldef.relopts, coldef.relpersistence, concat(string_agg(coldef.col_create_sql, E',\n ') , (select concat(E',\n ',pg_get_constraintdef(oid)) from pg_constraint where contype='p' and conrelid = coldef.oid)) as cols_create_sql
FROM coldef
GROUP BY coldef.nspname, coldef.relname, coldef.oid, 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 = tabdef.oid ),
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(tabdef.oid), '')
) as table_create_sql
FROM tabdef
$$;


效果:
=# select tabledef('public','pgbench_accounts');
tabledef
────────────────────────────────────────
CREATE TABLE public.pgbench_accounts (↵
aid integer NOT NULL, ↵
bid integer, ↵
abalance integer, ↵
filler character(84), ↵
PRIMARY KEY (aid) ↵
) WITH (fillfactor=100);
(1
row)

注意:

1、这个function是database级别的,如果换到其它database 需要重建创建function。

2、经测试,支持view的导出查看

3、经测试,得出的建表语句中,是不会带有外键的信息,如果用到了外键的请注意!

 

第三种,使用pgddl插件

要使用root用户安装此插件,并在安装时设置好环境变量。 稍微费点事。感兴趣的可以看官方文档​​https://github.com/lacanoid/pgddl​

 


标签:语句,PostgreSQL,查看,oid,when,attrdef,catalog,pg,coldef
From: https://blog.51cto.com/lee90/5826008

相关文章

  • JavaSE—三种控制语句
    Java程序通过控制语句来执行程序流,从而完成一定的任务。程序流时通过若干条语句组成的,语句可以是单一的一条,如c=a+b,也可以是用大括号{}括起来的一个复合语句。Java中的控制......
  • [postgresql]用户管理
    前言PostgreSQL使用角色的概念管理数据库访问权限。角色是一系列相关权限的集合。为了管理方便,通常把一系列相关的数据库权限赋给一个角色,如果哪个用户需要这些权限,就把角......
  • 实验3 C语言控制语句应用编程
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#defineN80voidprint_text(intline,intcol,chartext[]);//函数声明voidp......
  • .net core web html中午查看源码显示乱码
    在.NetCoreWeb的视图获取从后台传来的数据的时候,默认使用的是UnicodeRanges.BasicLatin进行的编码,所以在前台显示中文,而在查看源码的时候,就会发现中文进行过编码操作......
  • SQL语句之if,case
    其他函数、case语句1.聚合函数 max(),min(),avg(),sum(),count() 2.if(bool表达式,expr1,expr2) 如果bool表达式成立(true),......
  • 野花--使用开发者工具查看及调试hover等状态的样式
    第一种:选中需要检查hover状态的元素,在开发者工具中的forceelementstate中强制选择响应的状态,就会显示响应的css样式.但是这种调试依然无法直接在页面上实时看到hove......
  • mac linux 查看端口占用情况
    maclsof-i:8080nodejs项目,启动初问题了,终断后,老出现,端口占用启动不了的情况linux1.也可以用lsof-i:端口号----发现有的linux服务器不支持lsofnetstat-ntl......
  • 5分钟搞定 PostgreSQL 到 Doris 数据迁移和同步
    简述ApacheDoris是一个现代化的MPP分析型数据库产品,仅需亚秒级响应时间即可获得查询结果,能有效地支持实时数据分析。本文主要介绍如何使用CloudCanal快速构建一......
  • Suse安装PostgreSQL
    【1】安装数据库XXXX:/data/software#lspostgresql-9.6.5-1-linux-x64.runXXXX:/data/software#./postgresql-9.6.5-1-linux-x64.run--------------------------......
  • 查看mysql中SQL的执行计划
    查看sql语句通过数据引擎优化后的执行计划--关键字EXPLAINEXTENDED--sql语句SELECT*FROMp_user_role_refLEFTJOINp_roleONp_role.role_id=p_user_role_ref.ro......