参考博文:https://blog.csdn.net/xiaofengtoo/article/details/84395199

修复了其函数中的bug,支持生成包含:字段(支持数组类型字段)、约束、索引(支持生成唯一索引,支持全类型索引)在内的建表语句。

生成的sql指定scheme为:【sch_租户id】,不同scheme生成规则或者不需要指定scheme直接修改下相关代码即可使用。

  1. CREATE OR REPLACE FUNCTION "public"."findattname"("dbinstancename" varchar, "namespace" varchar, "tablename" varchar, "ctype" varchar)
  2. RETURNS "pg_catalog"."varchar" AS $BODY$
  3.  
  4. declare
  5. tt oid ;
  6. aname character varying default '';
  7.  
  8. begin
  9. tt := oid from pg_class where relname= tablename
  10. and relnamespace =(select oid from pg_namespace where nspname=namespace and nspowner=(select datdba from pg_database where datname=dbinstancename) ) ;
  11. aname:= array_to_string(
  12. array(
  13. select a.attname from pg_attribute a
  14. where a.attrelid=tt and a.attnum in (
  15. select unnest(conkey) from pg_constraint c where contype=ctype
  16. and conrelid=tt and array_to_string(conkey,',') is not null
  17. )
  18. ),',')
  19. ;
  20.  
  21. return aname;
  22. end
  23.  
  24. $BODY$
  25. LANGUAGE plpgsql VOLATILE
  26. COST 100
  1. CREATE OR REPLACE FUNCTION "public"."showcreatetable"("dbinstancename" varchar, "namespace" varchar, "tablename" varchar, "tenantid" varchar)
  2. RETURNS "pg_catalog"."varchar" AS $BODY$
  3. declare
  4. tableScript character varying default '';
  5. tableNum int2 ;
  6.  
  7. begin
  8. -- check db extist
  9. tableNum:= count(*) from pg_class where relname=tablename and relnamespace =(
  10. select oid from pg_namespace where nspowner=(select datdba from pg_database where datname=dbinstancename) and nspname = namespace
  11. );
  12. IF tableNum=0 then
  13. return '' ;
  14. end if;
  15. -- columns
  16. tableScript:=tableScript || ' CREATE TABLE IF NOT EXISTS '|| '"sch_'||tenantid||'".'||tablename|| ' ( '|| array_to_string(
  17. array(
  18. select concat( c1, c2, c3, c4, c5, c6 ) as column_line
  19. from (
  20. select '"'||column_name||'"' || ' ' || case when data_type='ARRAY' then ltrim(udt_name,'_')||'[]' else data_type end as c1,
  21. case when character_maximum_length > 0 then '(' || character_maximum_length || ')' end as c2,
  22. case when numeric_precision > 0 and numeric_scale < 1 then null end as c3,
  23. case when numeric_precision > 0 and numeric_scale > 0 then null end as c4,
  24. case when is_nullable = 'NO' then ' NOT NULL' end as c5,
  25. case when column_default is not Null then ' DEFAULT' end || ' ' || replace(column_default, '::character varying', '') as c6
  26. from information_schema.columns
  27. where table_name = tablename
  28. and table_catalog=dbinstancename
  29. and table_schema=namespace
  30. order by ordinal_position
  31. ) as string_columns
  32. ),' , ') ||',' ;
  33.  
  34. -- 约束
  35. tableScript:= tableScript || array_to_string(
  36. array(
  37. select concat(' CONSTRAINT ','"'||conname||'"' ,c ,u,p,f) from (
  38. select conname,
  39. case when contype='c' then ' CHECK('|| consrc ||')' end as c ,
  40. case when contype='u' then ' UNIQUE('|| ( select findattname(dbinstancename,namespace,tablename,'u') ) ||')' end as u ,
  41. case when contype='p' then ' PRIMARY KEY ('|| ( select findattname(dbinstancename,namespace,tablename,'p') ) ||')' end as p ,
  42. case when contype='f' then ' FOREIGN KEY('|| ( select findattname(dbinstancename,namespace,tablename,'u') ) ||') REFERENCES '||
  43. (select p.relname from pg_class p where p.oid=c.confrelid ) || '('|| ( select findattname(dbinstancename,namespace,tablename,'u') ) ||')' end as f
  44. from pg_constraint c
  45. where contype in('u','c','f','p') and conrelid=(
  46. select oid from pg_class where relname=tablename and relnamespace =(
  47. select oid from pg_namespace where nspowner=(select datdba from pg_database where datname=dbinstancename) and nspname = namespace
  48. )
  49. )
  50. ) as t
  51. ) ,',' ) || ' ); ';
  52.  
  53. --
  54. /** **/
  55. --- 获取非约束索引 column
  56. -- CREATE UNIQUE INDEX pg_language_oid_index ON pg_language USING btree (oid); -- table pg_language
  57. tableScript:= tableScript || array_to_string(
  58. array(
  59. select 'CREATE '||case when is_unique_index=true then 'UNIQUE INDEX' else 'INDEX' end ||'"' || indexrelname ||'"' || ' ON ' || '"sch_'||tenantid||'".'||tablename|| ' USING '||index_type|| '(' || attname || ');' from (
  60. SELECT
  61. i.relname AS indexrelname , x.indkey,
  62. ( select array_to_string (
  63. array(
  64. select a.attname from pg_attribute a where attrelid=c.oid and a.attnum in ( select unnest(x.indkey) )
  65.  
  66. )
  67. ,',' ) )as attname, x.indisunique is_unique_index,am.amname index_type
  68.  
  69. FROM pg_class c
  70. JOIN pg_index x ON c.oid = x.indrelid
  71. JOIN pg_class i ON i.oid = x.indexrelid
  72. join pg_am am on am.oid = i.relam
  73. LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
  74. WHERE c.relname=tablename and i.relname not in
  75. ( select constraint_name from information_schema.key_column_usage where table_name=tablename )
  76. and c.relnamespace =(
  77. select oid from pg_namespace where nspowner=(select datdba from pg_database where datname=dbinstancename) and nspname = namespace
  78. )
  79. )as t
  80. ) ,'' );
  81.  
  82. return tableScript;
  83.  
  84. end
  85. $BODY$
  86. LANGUAGE plpgsql VOLATILE
  87. COST 100

postgreSQL生成建表语句的更多相关文章

  1. sqlserver 表中记录生成insert,可以加条件,可以生成建表语句

    sqlserver 表中记录生成insert,可以加条件,可以生成建表语句 create PROCEDURE [sp_getinsert] ( ) , --如果非默认架构,可以加上架构名 例如:sch ...

  2. 【SQL】ORACLE在sqlplus中使用spool方式生成建表语句

    在实际生产中有时我们需要将一张表的数据导入到另外一张表,如果有PLSQL,我们可以通过PLSQL工具将数据导出为sql脚本,然后再在另外一个数据库中执行这个脚本.但有时在实际生产中我们没有PLSQL这 ...

  3. Hibernate根据配置文件,生成建表语句

    import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class ...

  4. sqlite3 根据实体自动生成建表语句

      public class BuildSqlTool { public static string GetCreateTableSql(object t) { //CREATE TABLE &quo ...

  5. Oracle 自动生成hive建表语句

    从 oracle 数据库导数到到 hive 大数据平台,需要按照大数据平台的数据规范,重新生成建表的 SQL 语句,方便其间,写了一个自动生成SQL的存储过程. ① 创建一张表,用来存储源表的结构,以 ...

  6. 脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明

    常规建表语句: CREATE TABLE `test_table` ( `id` int(11) NOT NULL, `name` char(64) NOT NULL, `password` char ...

  7. 基于表的数据字典构造MySQL建表语句

    表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...

  8. 根据javabean转换为mysql建表语句与mapper内容

    原文地址:  https://www.cnblogs.com/Jeffscnblog/p/10072483.html 一般上,我们会使用数据库表转换为javabean.dao.或是mapper,就叫逆 ...

  9. excel的宏与VBA实践——建表语句

    一.建表语句 不带分区版本:V1.0: Sub createTableDDL() '自动创建建表语句 '定义换行和TAB Ln = ) + ) TB = ) '定义脚本目录 Dim dir AS St ...

随机推荐

  1. 纪中集训2020.02.09【NOIP提高组】模拟B 组总结反思

    目录 JZOJ.1747[NOIP2014模拟11.5]无穷迷宫 比赛时 之后 总结 JZOJ1478.[NOIP2014模拟11.5]近似乘积 比赛时 之后 总结 JZOJ3926. [NOIP20 ...

  2. 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( ...

  3. .net core 简单定时程序

    using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Orleans; using S ...

  4. 基于TCP协议Socket通信

    服务器线程处理类 package demo4; import java.io.*; import java.net.Socket; /** * 服务器线程处理类 * @ClassName Server ...

  5. 数据结构与算法之比较排序【Java】

    比较排序与非比较排序的对比 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置.在冒泡排 ...

  6. Android学习笔记(一)

    目录 Android学习笔记(一) 一.JDK.Android SDK 二.部分项目结构 三.字符串引用 四.外层build.gradle详解 五.app->build.gradle详解 六.日 ...

  7. 1级搭建类101-Oracle 11g 单实例 FS LVM(11.2.0.4+RHEL 5)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  8. Ex-KMP(模板)

    首先,明白Ex-KMP是干什么的: 给定两个字符串母串S和子串T(长度分别为n和m),下标从0开始,定义extend[i]等于S[i]-S[n-1]与T的最长公共前缀的长度,求出所有的extend[i ...

  9. python 3 可迭代对象与迭代器

    1,可迭代对象 内部含有__iter__方法的对象是可迭代对象 遵循可迭代协议 dir() 检查对象含有什么方法 dir()会返回一个列表,这个列表中含有该对象的以字符串的形式所有方法名.这样我们就可 ...

  10. 【巨杉数据库SequoiaDB】巨杉再获企业级认可,分布式数据库领跑“一亿中流”

    据全球最具权威的IT研究与顾问咨询公司 Gartner 预测,DBMS(数据库管理系统)市场从2017年到2018年增长了18.4%,达到461亿美元,这是有史以来最大幅的增长,并有望在2019年超过 ...