PostgreSQL教程--实现类似于MySQL的show create table功能

背景

在MySQL数据库中,可以通过show create table查询表的create sql 语句,
但在PostgreSQL数据库中,没有类似的命令,但可以通过function 来实现

1、show create table函数

CREATE OR REPLACE FUNCTION "public"."showcreatetable"("namespace" varchar, "tablename" varchar)RETURNS "pg_catalog"."varchar" AS $BODY$
declare 
tableScript character varying default '';begin
-- columns
tableScript:=tableScript || ' CREATE TABLE '|| tablename|| ' ( '|| chr(13)||chr(10) || array_to_string(array(
select '   ' || concat_ws('  ',fieldName, fieldType, fieldLen, indexType, isNullStr, fieldComment ) as column_line
from (
select a.attname as fieldName,format_type(a.atttypid,a.atttypmod) as fieldType,' ' as fieldLen,
'' as indexType,
(case when a.attnotnull=true then 'not null' else 'null' end) as isNullStr,
' 'as fieldComment 
from pg_attribute a where attstattarget=-1 and attrelid = (select c.oid from pg_class c,pg_namespace n where c.relnamespace=n.oid and n.nspname =namespace and relname =tablename)) as string_columns
),','||chr(13)||chr(10)) || ',';-- 约束
tableScript:= tableScript || chr(13)||chr(10) || array_to_string(
array(select concat('   CONSTRAINT ',conname ,c ,u,p,f)   from (select conname,case when contype='c' then  ' CHECK('|| ( select findattname(namespace,tablename,'c') ) ||')' end  as c  ,case when contype='u' then  ' UNIQUE('|| ( select findattname(namespace,tablename,'u') ) ||')' end as u ,case when contype='p' then ' PRIMARY KEY ('|| ( select findattname(namespace,tablename,'p') ) ||')' end  as p  ,case when contype='f' then ' FOREIGN KEY('|| ( select findattname(namespace,tablename,'u') ) ||') REFERENCES '|| (select p.relname from pg_class p where p.oid=c.confrelid )  || '('|| ( select findattname(namespace,tablename,'u') ) ||')' end as  ffrom pg_constraint cwhere contype in('u','c','f','p') and conrelid=( select oid  from pg_class  where relname=tablename and relnamespace =(select oid from pg_namespace where nspname = namespace))) as t  
) ,',' || chr(13)||chr(10) ) || chr(13)||chr(10) ||' ); ';-- indexs 
-- CREATE UNIQUE INDEX pg_language_oid_index ON pg_language USING btree (oid); -- table pg_language-- 
/** **/
--- 获取非约束索引 column
-- CREATE UNIQUE INDEX pg_language_oid_index ON pg_language USING btree (oid); -- table pg_language
tableScript:= tableScript || chr(13)||chr(10) || chr(13)||chr(10) || array_to_string(array(select 'CREATE INDEX ' || indexrelname || ' ON ' || tablename || ' USING btree '|| '(' || attname || ');' from (SELECT i.relname AS indexrelname ,  x.indkey, ( select array_to_string (array( select a.attname from pg_attribute a where attrelid=c.oid and a.attnum in ( select unnest(x.indkey) )) ,',' ) )as attnameFROM pg_class cJOIN pg_index x ON c.oid = x.indrelidJOIN pg_class i ON i.oid = x.indexrelidLEFT JOIN pg_namespace n ON n.oid = c.relnamespaceWHERE  c.relname=tablename and i.relname not in( select constraint_name from information_schema.key_column_usage  where  table_name=tablename  ))as t
) ,','|| chr(13)||chr(10));-- COMMENT COMMENT ON COLUMN sys_activity.id IS '主键';
tableScript:= tableScript || chr(13)||chr(10) || chr(13)||chr(10) || array_to_string(
array(
SELECT 'COMMENT ON COLUMN ' || tablename || '.' || a.attname ||' IS  '|| ''''|| d.description ||''''
FROM pg_class c
JOIN pg_description d ON c.oid=d.objoid
JOIN pg_attribute a ON c.oid = a.attrelid
WHERE c.relname=tablename
AND a.attnum = d.objsubid),';'|| chr(13)||chr(10)) ;return tableScript;end
$BODY$LANGUAGE plpgsql VOLATILECOST 100

2、findattname函数

CREATE OR REPLACE FUNCTION "public"."findattname"("namespace" varchar, "tablename" varchar, "ctype" varchar)RETURNS "pg_catalog"."varchar" AS $BODY$declare
tt oid ;
aname character varying default '';begintt := oid from pg_class where relname= tablename and relnamespace =(select oid from pg_namespace  where nspname=namespace) ;aname:=  array_to_string(array(select a.attname  from pg_attribute  a where a.attrelid=tt and  a.attnum   in (		select unnest(conkey) from pg_constraint c where contype=ctype and conrelid=tt  and array_to_string(conkey,',') is not null  ) ),',');return aname;
end
$BODY$LANGUAGE plpgsql VOLATILECOST 100

3、generate_create_table_statement函数

CREATE OR REPLACE FUNCTION "public"."generate_create_table_statement"("p_table_name" varchar)RETURNS "pg_catalog"."text" AS $BODY$
DECLAREv_table_ddl   text;column_record record;
BEGINFOR 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 dWHERE 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 dWHERE 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_attnumFROM pg_catalog.pg_attribute aINNER JOIN (SELECT c.oid,n.nspname,c.relnameFROM pg_catalog.pg_class cLEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespaceWHERE c.relname ~ ('^('||p_table_name||')$')AND pg_catalog.pg_table_is_visible(c.oid)ORDER BY 2, 3) bON a.attrelid = b.oidINNER JOIN (SELECT a.attrelid,max(a.attnum) as max_attnumFROM pg_catalog.pg_attribute aWHERE a.attnum > 0 AND NOT a.attisdroppedGROUP BY a.attrelid) eON a.attrelid=e.attrelidWHERE a.attnum > 0 AND NOT a.attisdroppedORDER BY a.attnumLOOPIF column_record.attnum = 1 THENv_table_ddl:='CREATE TABLE '||column_record.schema_name||'.'||column_record.table_name||' (';ELSEv_table_ddl:=v_table_ddl||',';END IF;IF column_record.attnum <= column_record.max_attnum THENv_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 VOLATILECOST 100

3、postgresql中函数调用

select 'sys_dept' AS table,showcreatetable('public','sys_dept') AS create_table

4、实现效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/423125.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL--删除数据库(2)

使用普通用户登陆 MySQL 服务器&#xff0c;你可能需要特定的权限来创建或者删除 MySQL 数据库&#xff0c;所以我们这边使用 root 用户登录&#xff0c;root 用户拥有最高权限。 在删除数据库过程中&#xff0c;务必要十分谨慎&#xff0c;因为在执行删除命令后&#xff0c;所…

JAVA 学习 面试(四)垃圾回收篇

Java中的每个对象都经历了创建、使用和最终被回收的过程。从对象实例化开始&#xff0c;它可能被程序的多个部分引用&#xff0c;直到最后一个引用消失&#xff0c;对象成为垃圾&#xff0c;等待回收。 JVM垃圾查找算法 &#xff08;1&#xff09;引用计数法&#xff1a;已淘…

(十一)Head first design patterns状态模式(c++)

状态模式 如何去描述状态机&#xff1f; 假设你需要实例化一台电梯&#xff0c;并模仿出电梯的四个状态&#xff1a;开启、关闭、运行、停止。也许你会这么写 class ILift{ public:virtual void open(){}virtual void close(){}virtual void run(){}virtual void stop(){} }…

为什么电脑降价了?

周末&#xff0c;非常意外地用不到3000元买到了一款2023年度发布的华为笔记本I5,16G,500G&#xff0c;基本是主流配置&#xff0c;我非常意外&#xff0c;看了又看&#xff0c;不是什么Hwawii&#xff0c;或者Huuawe。然后也不是二手。为什么呢&#xff1f;因为在ALU和FPU之外&…

Java和Redis实现一个简单的热搜功能

1. 前言 我们有一个简单的需求&#xff1a; 搜索栏展示当前登陆的个人用户的搜索历史记录&#xff0c;删除个人历史记录。用户在搜索栏输入某字符&#xff0c;则将该字符记录下来 以zset格式存储的redis中&#xff0c;记录该字符被搜索的个数以及当前的时间戳 &#xff08;用…

Qt Linux安装qt5.9全过程

1 准备好安装包 qt安装包下载官网:https://download.qt.io/archive/qt 2 将安装包放到Linux环境下 我这里使用WinSCP将windows下的文件传输到Linux 3 ./qt-opensource-linux-x64-5.9.0.run 3-0 运行时目录的所有权错误wrong ownership on runtime directory 解决:切换roo…

K8S的helm

helm的作用 在没有helm之前&#xff0c;deploymen service ingress &#xff0c;helm的作用就是通过打包的方式&#xff0c;把deployment&#xff0c;service&#xff0c;ingress 这些打包在一块&#xff0c;一键式的部署服务&#xff0c;类似yum 官方提供的一个类似于安装仓库…

大数据开发之Scala

第 1 章&#xff1a;scala入门 1.1 概述 scala将面向对象和函数式编程结合成一种简洁的高级语言 特点 1、scala和java一样属于jvm语言&#xff0c;使用时都需要先编译为class字节码文件&#xff0c;并且scala能够直接调用java的类库 2、scala支持两种编程范式面向对象和函数式…

Maven工程继承和聚合关系

1. Maven工程继承关系 1.1 继承概念 Maven 继承是指在 Maven 的项目中&#xff0c;让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息&#xff0c;简化项目的管理和维护工作。 1.2 继承作用 在父工程中统一管理项目中的依赖信息。 …

初识 JVM

什么是JVM JVM 全称是 J ava V irtual M achine&#xff0c;中文译名 Java虚拟机 。 JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行 Java字节码文件 。 JVM的功能 Java语言如果不做任何优化&#xff0c;性能不如C、C等语言。 Java需要实时解释&…

什么是网络安全?网络安全概况

网络安全涉及保护我们的计算机网络、设备和数据免受未经授权的访问或破坏。 这个领域包括多种技术、过程和控制措施&#xff0c;旨在保护网络、设备和数据免受攻击、损害或未授权访问。网络安全涉及多个方面&#xff0c;包括但不限于信息安全、应用程序安全、操作系统安全等 …

仓储管理系统——软件工程报告(详细设计)④

详细设计 一、系统功能模块的划分 根据系统的功能性需求&#xff0c;本文将部队仓库管理系统分为以下六大模块&#xff1a;系统管理模 块、基础数据模块、出入库管理模块、库存管理模块、仓库信息管理模块、作业管理模 块&#xff0c;每个模块内部又分为很多小功能模块&#…