当前位置:数据库 > SQLServer >>

postgreSQL实现show create table

postgreSQL实现show create table
 
在mysql 中show create table 可以直接查询表的create sql 语句,在postgreSQL 没有这个命令,所以通过function 来实现,代码如下:
   www.zzzyk.com  
前提 定义一个公用的函数:findattname
Sql代码  
CREATE OR REPLACE FUNCTION findattname(namespace character varying, tablename character varying, ctype character varying)  
  RETURNS character varying 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) ;  
    -- select oid from pg_namespace where nspowner=(select datdba from pg_database where datname=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 VOLATILE  
  COST 100;  
 
showcreatetable:
Sql代码  
CREATE OR REPLACE FUNCTION showcreatetable(namespace character varying, tablename character varying)  
  RETURNS character varying AS  
    
$BODY$  
declare   
tableScript character varying default '';  
  
begin  
-- columns  
tableScript:=tableScript || ' CREATE TABLE '|| tablename|| ' ( '|| array_to_string(  
  array(  
select concat( c1, c2, c3, c4, c5, c6 ) as column_line  
from (  
  select column_name || ' ' || data_type 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 '(' || numeric_precision || ')' end as c3,  
    case when numeric_precision > 0 and numeric_scale > 0 then '(' || numeric_precision || ', ' || numeric_scale || ')' 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_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(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  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=namespace)  
            )  
         )  
    ) as t    
) ,',' ) || ' ); ';  
      
-- 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 || array_to_string(  
    array(  
        select 'CREATE UNIQUE 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 attname  
              
           FROM pg_class c  
           JOIN pg_index x ON c.oid = x.indrelid  
           JOIN pg_class i ON i
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,