在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');
相关推荐
博客:PostgreSQL的学习心得和知识总结(五十六)|语法级自上而下完美实现MySQL数据库的 show create table 的实现方案
2. **获取库表信息**:通过查询语句,如`SHOW CREATE TABLE`(MySQL)或`\d+ table_name`(PostgreSQL),获取表的创建语句,这包含了表的完整结构信息。 3. **定制模板**:创建一个Word文档模板,可以包含表格、...
- `SHOW CREATE TABLE table_name;` **6.3 修改表** - **修改表名**:`RENAME TABLE old_name TO new_name;` - **修改字段的数据类型**:`ALTER TABLE table_name MODIFY column_name new_data_type;` - **更改表的...
- **SHOW CREATE TABLE**:`SHOW CREATE TABLE table_name;` 3. **修改表** - **修改表名**:`RENAME TABLE old_table_name TO new_table_name;` - **修改字段的数据类型**:`ALTER TABLE table_name MODIFY ...
诚然SQLite允许忽略数据类型 但是仍然建议在你的Create Table语句中指定数据类型 因为数据类型对于你和其他的程序员交流 或者你准备换掉你的数据库引擎 SQLite支持常见的数据类型 如: CREATE TABLE ex2 a ...
- SHOW CREATE TABLE table_name; 查看表的详细结构。 3. **修改表**: - ALTER TABLE语句用于修改现有表的结构。 - 改变字段名称、数据类型等。 4. **删除表**: - DROP TABLE table_name; 删除一个或多个表...
终极SQL课程 资料库 具有可访问界面的结构化计算机数据集 资料收集 ... 创建表:CREATE TABLE猫(必须始终为复数) 例子: CREATE TABLE tablename ( column_name data_type, column_name data_
首先,我们要了解影响查询效率的一些关键参数,这些参数通常在`postgresql.conf`文件中定义,并可通过`SHOW`命令查看。 1. `seq_page_cost`: 这个参数表示顺序读取一个页面的代价,默认值为1.0,表示在一个假设的...
诚然SQLite允许忽略数据类型, 但是仍然建议在你的Create Table语句中指定数据类型. 因为数据类型对于你和其他的程序员交流, 或者你准备换掉你的数据库引擎. SQLite支持常见的数据类型, 如: CREATE TABLE ex2( ...
22. **CREATE TABLE AS**: 通过SQL查询创建新表。 23. **CREATE TRIGGER**: 定义触发器,当满足特定事件时执行指定的操作。 24. **CREATE TYPE**: 定义新的数据类型,如枚举类型。 25. **CREATE USER**: 创建新的...
- 创建表的基本语法:`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. 查看...
- `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...
- **CREATE TABLE AS**: 从查询结果创建一个新的表。 - **CREATE INDEX**: 定义一个新的索引。 - **CREATE VIEW**: 定义一个视图。 - **CREATE SEQUENCE**: 创建一个新的序列发生器。 - **CREATE FUNCTION**: 定义一...
6. **其他Hive操作**:除了基本的创建表、加载数据和查询,Hive还支持数据更新(如ALTER TABLE)、视图创建(CREATE VIEW)、数据导出(EXPORT TABLE)、数据导入(IMPORT TABLE)以及元数据管理等高级功能。...
- `SHOW CREATE TABLE tbl_name;`:查看指定表的创建信息。 以上内容涵盖了MySQL数据库的基础概念、术语、操作以及数据表的相关管理。通过学习这些内容,可以更好地理解和使用MySQL数据库系统。
创建数据表命令格式:CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name (column1 datatype, column2 datatype, ...); 其中,TEMPORARY关键字用于创建临时表,IF NOT EXISTS子句用来避免创建表时出现表已存在...
然而,MySQL已被Oracle收购,版权问题尚不明朗,因此也可关注同样开源的PostgreSQL,其在SQL标准的实现上更为严格。 在安装MySQL时,应选择稳定版,如MySQL 5.1或5.5。连接数据库通常通过命令行工具,如果出现找不...
`查看所有表,`CREATE TABLE <表名>(...);`创建表,`ALTER TABLE`用于修改表结构,`DROP TABLE <表名>;`删除表。此外,`DESCRIBE <表名>;`可以查看表的详细结构。 通过理解这些基本概念和操作,你可以开始使用MySQL...