postgreSQL生成建表语句
参考博文:https://blog.csdn.net/xiaofengtoo/article/details/84395199
修复了其函数中的bug,支持生成包含:字段(支持数组类型字段)、约束、索引(支持生成唯一索引,支持全类型索引)在内的建表语句。
生成的sql指定scheme为:【sch_租户id】,不同scheme生成规则或者不需要指定scheme直接修改下相关代码即可使用。
- CREATE OR REPLACE FUNCTION "public"."findattname"("dbinstancename" varchar, "namespace" varchar, "tablename" varchar, "ctype" varchar)
- RETURNS "pg_catalog"."varchar" AS $BODY$
- declare
- tt oid ;
- aname character varying default '';
- begin
- tt := oid from pg_class where relname= tablename
- and relnamespace =(select oid from pg_namespace where nspname=namespace and nspowner=(select datdba from pg_database where datname=dbinstancename) ) ;
- 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 VOLATILE
- COST 100
- CREATE OR REPLACE FUNCTION "public"."showcreatetable"("dbinstancename" varchar, "namespace" varchar, "tablename" varchar, "tenantid" varchar)
- RETURNS "pg_catalog"."varchar" AS $BODY$
- declare
- tableScript character varying default '';
- tableNum int2 ;
- begin
- -- check db extist
- tableNum:= count(*) from pg_class where relname=tablename and relnamespace =(
- select oid from pg_namespace where nspowner=(select datdba from pg_database where datname=dbinstancename) and nspname = namespace
- );
- IF tableNum=0 then
- return '' ;
- end if;
- -- columns
- tableScript:=tableScript || ' CREATE TABLE IF NOT EXISTS '|| '"sch_'||tenantid||'".'||tablename|| ' ( '|| array_to_string(
- array(
- select concat( c1, c2, c3, c4, c5, c6 ) as column_line
- from (
- select '"'||column_name||'"' || ' ' || case when data_type='ARRAY' then ltrim(udt_name,'_')||'[]' else data_type end as c1,
- case when character_maximum_length > 0 then '(' || character_maximum_length || ')' end as c2,
- case when numeric_precision > 0 and numeric_scale < 1 then null end as c3,
- case when numeric_precision > 0 and numeric_scale > 0 then null end as c4,
- case when is_nullable = 'NO' then ' NOT NULL' end as c5,
- case when column_default is not Null then ' DEFAULT' end || ' ' || replace(column_default, '::character varying', '') as c6
- from information_schema.columns
- where table_name = tablename
- and table_catalog=dbinstancename
- and table_schema=namespace
- order by ordinal_position
- ) as string_columns
- ),' , ') ||',' ;
- -- 约束
- tableScript:= tableScript || array_to_string(
- array(
- select concat(' CONSTRAINT ','"'||conname||'"' ,c ,u,p,f) from (
- select conname,
- case when contype='c' then ' CHECK('|| consrc ||')' end as c ,
- case when contype='u' then ' UNIQUE('|| ( select findattname(dbinstancename,namespace,tablename,'u') ) ||')' end as u ,
- case when contype='p' then ' PRIMARY KEY ('|| ( select findattname(dbinstancename,namespace,tablename,'p') ) ||')' end as p ,
- case when contype='f' then ' FOREIGN KEY('|| ( select findattname(dbinstancename,namespace,tablename,'u') ) ||') REFERENCES '||
- (select p.relname from pg_class p where p.oid=c.confrelid ) || '('|| ( select findattname(dbinstancename,namespace,tablename,'u') ) ||')' end as f
- from pg_constraint c
- where contype in('u','c','f','p') and conrelid=(
- select oid from pg_class where relname=tablename and relnamespace =(
- select oid from pg_namespace where nspowner=(select datdba from pg_database where datname=dbinstancename) and nspname = namespace
- )
- )
- ) as t
- ) ,',' ) || ' ); ';
- --
- /** **/
- --- 获取非约束索引 column
- -- CREATE UNIQUE INDEX pg_language_oid_index ON pg_language USING btree (oid); -- table pg_language
- tableScript:= tableScript || array_to_string(
- array(
- select 'CREATE '||case when is_unique_index=true then 'UNIQUE INDEX' else 'INDEX' end ||'"' || indexrelname ||'"' || ' ON ' || '"sch_'||tenantid||'".'||tablename|| ' USING '||index_type|| '(' || 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 attname, x.indisunique is_unique_index,am.amname index_type
- FROM pg_class c
- JOIN pg_index x ON c.oid = x.indrelid
- JOIN pg_class i ON i.oid = x.indexrelid
- join pg_am am on am.oid = i.relam
- LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
- WHERE c.relname=tablename and i.relname not in
- ( select constraint_name from information_schema.key_column_usage where table_name=tablename )
- and c.relnamespace =(
- select oid from pg_namespace where nspowner=(select datdba from pg_database where datname=dbinstancename) and nspname = namespace
- )
- )as t
- ) ,'' );
- return tableScript;
- end
- $BODY$
- LANGUAGE plpgsql VOLATILE
- COST 100
postgreSQL生成建表语句的更多相关文章
- sqlserver 表中记录生成insert,可以加条件,可以生成建表语句
sqlserver 表中记录生成insert,可以加条件,可以生成建表语句 create PROCEDURE [sp_getinsert] ( ) , --如果非默认架构,可以加上架构名 例如:sch ...
- 【SQL】ORACLE在sqlplus中使用spool方式生成建表语句
在实际生产中有时我们需要将一张表的数据导入到另外一张表,如果有PLSQL,我们可以通过PLSQL工具将数据导出为sql脚本,然后再在另外一个数据库中执行这个脚本.但有时在实际生产中我们没有PLSQL这 ...
- Hibernate根据配置文件,生成建表语句
import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class ...
- sqlite3 根据实体自动生成建表语句
public class BuildSqlTool { public static string GetCreateTableSql(object t) { //CREATE TABLE &quo ...
- Oracle 自动生成hive建表语句
从 oracle 数据库导数到到 hive 大数据平台,需要按照大数据平台的数据规范,重新生成建表的 SQL 语句,方便其间,写了一个自动生成SQL的存储过程. ① 创建一张表,用来存储源表的结构,以 ...
- 脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明
常规建表语句: CREATE TABLE `test_table` ( `id` int(11) NOT NULL, `name` char(64) NOT NULL, `password` char ...
- 基于表的数据字典构造MySQL建表语句
表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...
- 根据javabean转换为mysql建表语句与mapper内容
原文地址: https://www.cnblogs.com/Jeffscnblog/p/10072483.html 一般上,我们会使用数据库表转换为javabean.dao.或是mapper,就叫逆 ...
- excel的宏与VBA实践——建表语句
一.建表语句 不带分区版本:V1.0: Sub createTableDDL() '自动创建建表语句 '定义换行和TAB Ln = ) + ) TB = ) '定义脚本目录 Dim dir AS St ...
随机推荐
- 纪中集训2020.02.09【NOIP提高组】模拟B 组总结反思
目录 JZOJ.1747[NOIP2014模拟11.5]无穷迷宫 比赛时 之后 总结 JZOJ1478.[NOIP2014模拟11.5]近似乘积 比赛时 之后 总结 JZOJ3926. [NOIP20 ...
- php ftp 使用 以及 php_connect_nonb() failed: Operation now in progress (115)
设置 ftp_pasv($conn,true); 会出现下面错误 不设置 调用ftp 连接没问题 ftp_nlist ftp_put ftp_get 等函数都不成功 ftp_nb_fput( ...
- .net core 简单定时程序
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Orleans; using S ...
- 基于TCP协议Socket通信
服务器线程处理类 package demo4; import java.io.*; import java.net.Socket; /** * 服务器线程处理类 * @ClassName Server ...
- 数据结构与算法之比较排序【Java】
比较排序与非比较排序的对比 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置.在冒泡排 ...
- Android学习笔记(一)
目录 Android学习笔记(一) 一.JDK.Android SDK 二.部分项目结构 三.字符串引用 四.外层build.gradle详解 五.app->build.gradle详解 六.日 ...
- 1级搭建类101-Oracle 11g 单实例 FS LVM(11.2.0.4+RHEL 5)公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...
- Ex-KMP(模板)
首先,明白Ex-KMP是干什么的: 给定两个字符串母串S和子串T(长度分别为n和m),下标从0开始,定义extend[i]等于S[i]-S[n-1]与T的最长公共前缀的长度,求出所有的extend[i ...
- python 3 可迭代对象与迭代器
1,可迭代对象 内部含有__iter__方法的对象是可迭代对象 遵循可迭代协议 dir() 检查对象含有什么方法 dir()会返回一个列表,这个列表中含有该对象的以字符串的形式所有方法名.这样我们就可 ...
- 【巨杉数据库SequoiaDB】巨杉再获企业级认可,分布式数据库领跑“一亿中流”
据全球最具权威的IT研究与顾问咨询公司 Gartner 预测,DBMS(数据库管理系统)市场从2017年到2018年增长了18.4%,达到461亿美元,这是有史以来最大幅的增长,并有望在2019年超过 ...