`
xiaofengtoo
  • 浏览: 492724 次
  • 性别: Icon_minigender_1
  • 来自: xiamen
社区版块
存档分类
最新评论

postgreSQL 实现show create table

    博客分类:
  • DB
 
阅读更多

在mysql 中show create table 可以直接查询表的create sql 语句,在postgreSQL 没有这个命令,所以通过function 来实现,代码如下:

 

前提 定义一个公用的函数:findattname

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:

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.oid = x.indexrelid
		   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  )
		)as t
) ,',' );
			

-- COMMENT COMMENT ON COLUMN sys_activity.id IS '主键';
tableScript:= tableScript || 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),',') ;

return tableScript;

end
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

 测试:

select showcreatetable('public','pg_seclabel');

 

分享到:
评论

相关推荐

    show_create_table2.patch

    博客:PostgreSQL的学习心得和知识总结(五十六)|语法级自上而下完美实现MySQL数据库的 show create table 的实现方案

    将MySQL或PostgreSQL的库表导出产生WORD文档

    2. **获取库表信息**:通过查询语句,如`SHOW CREATE TABLE`(MySQL)或`\d+ table_name`(PostgreSQL),获取表的创建语句,这包含了表的完整结构信息。 3. **定制模板**:创建一个Word文档模板,可以包含表格、...

    mysql练习复习最佳帮手

    - `SHOW CREATE TABLE table_name;` **6.3 修改表** - **修改表名**:`RENAME TABLE old_name TO new_name;` - **修改字段的数据类型**:`ALTER TABLE table_name MODIFY column_name new_data_type;` - **更改表的...

    MySQL入门很简单-学习笔记_20110913.pdf

    - **SHOW CREATE TABLE**:`SHOW CREATE TABLE table_name;` 3. **修改表** - **修改表名**:`RENAME TABLE old_table_name TO new_table_name;` - **修改字段的数据类型**:`ALTER TABLE table_name MODIFY ...

    SqliteDev 384

     诚然SQLite允许忽略数据类型 但是仍然建议在你的Create Table语句中指定数据类型 因为数据类型对于你和其他的程序员交流 或者你准备换掉你的数据库引擎 SQLite支持常见的数据类型 如:  CREATE TABLE ex2  a ...

    MySQL入门很简单-学习笔记.pdf

    - SHOW CREATE TABLE table_name; 查看表的详细结构。 3. **修改表**: - ALTER TABLE语句用于修改现有表的结构。 - 改变字段名称、数据类型等。 4. **删除表**: - DROP TABLE table_name; 删除一个或多个表...

    sql

    终极SQL课程 资料库 具有可访问界面的结构化计算机数据集 资料收集 ... 创建表:CREATE TABLE猫(必须始终为复数) 例子: CREATE TABLE tablename ( column_name data_type, column_name data_

    Postgresql查询效率计算初探

    首先,我们要了解影响查询效率的一些关键参数,这些参数通常在`postgresql.conf`文件中定义,并可通过`SHOW`命令查看。 1. `seq_page_cost`: 这个参数表示顺序读取一个页面的代价,默认值为1.0,表示在一个假设的...

    SQLite(SqliteDev)

     诚然SQLite允许忽略数据类型, 但是仍然建议在你的Create Table语句中指定数据类型. 因为数据类型对于你和其他的程序员交流, 或者你准备换掉你的数据库引擎. SQLite支持常见的数据类型, 如:  CREATE TABLE ex2(  ...

    SQL_命令.doc

    22. **CREATE TABLE AS**: 通过SQL查询创建新表。 23. **CREATE TRIGGER**: 定义触发器,当满足特定事件时执行指定的操作。 24. **CREATE TYPE**: 定义新的数据类型,如枚举类型。 25. **CREATE USER**: 创建新的...

    SQL语句汇总.pdf

    - 创建表的基本语法:`CREATE TABLE 表名(字段1数据类型, 字段2数据类型, ..., 字段n数据类型);` - 查看所有表的命令为:`SHOW TABLES;` - 修改表名字的语法为:`RENAME TABLE 旧表名 TO 新表名;` - 在表中添加...

    数据库常用命令

    这通常通过命令行客户端实现,如MySQL的`mysql -u username -p`或PostgreSQL的`psql -U username -d dbname`。连接后,输入密码并按回车。完成工作后,使用`exit`或`\q`(在PostgreSQL中)命令退出连接。 2. 查看...

    MySQL入门很简单-学习笔记

    - `CREATE TABLE table_name (column_name data_type);` - `ALTER TABLE table_name ADD PRIMARY KEY (column_name);` - `ALTER TABLE table_name ADD CONSTRAINT fk_column_name FOREIGN KEY (column_name) ...

    从数据库自动生成表结构

    例如,对于MySQL,可以使用`SHOW CREATE TABLE table_name;`命令来获取表的创建语句,从中解析出表结构。对于其他数据库系统,也有类似的SQL命令或API可以使用。 除此之外,还可以使用各种编程语言(如Python、Java...

    Oracle 常用命令

    - **CREATE TABLE AS**: 从查询结果创建一个新的表。 - **CREATE INDEX**: 定义一个新的索引。 - **CREATE VIEW**: 定义一个视图。 - **CREATE SEQUENCE**: 创建一个新的序列发生器。 - **CREATE FUNCTION**: 定义一...

    HIVE大数据平台白皮书.docx

    6. **其他Hive操作**:除了基本的创建表、加载数据和查询,Hive还支持数据更新(如ALTER TABLE)、视图创建(CREATE VIEW)、数据导出(EXPORT TABLE)、数据导入(IMPORT TABLE)以及元数据管理等高级功能。...

    深入浅出MySQL数据库1

    - `SHOW CREATE TABLE tbl_name;`:查看指定表的创建信息。 以上内容涵盖了MySQL数据库的基础概念、术语、操作以及数据表的相关管理。通过学习这些内容,可以更好地理解和使用MySQL数据库系统。

    MySQL数据库语言及其编程.pptx

    创建数据表命令格式:CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name (column1 datatype, column2 datatype, ...); 其中,TEMPORARY关键字用于创建临时表,IF NOT EXISTS子句用来避免创建表时出现表已存在...

    sql学习教程

    然而,MySQL已被Oracle收购,版权问题尚不明朗,因此也可关注同样开源的PostgreSQL,其在SQL标准的实现上更为严格。 在安装MySQL时,应选择稳定版,如MySQL 5.1或5.5。连接数据库通常通过命令行工具,如果出现找不...

    燕十八mysql笔记.doc

    `查看所有表,`CREATE TABLE &lt;表名&gt;(...);`创建表,`ALTER TABLE`用于修改表结构,`DROP TABLE &lt;表名&gt;;`删除表。此外,`DESCRIBE &lt;表名&gt;;`可以查看表的详细结构。 通过理解这些基本概念和操作,你可以开始使用MySQL...

Global site tag (gtag.js) - Google Analytics