postgresql查看表语句_PostgreSQL查看或生成表的建表语句

连接pg的jdbc的url格式:jdbc:postgresql://ip:port/dbname

查看指定库的所有表和视图信息

--法一:查询当前登录url所在可下public的

SELECT a.oid,

a.relname AS name,

b.description AS comment

FROM pg_class a

LEFT OUTER JOIN pg_description b ON b.objsubid=0 AND a.oid = b.objoid

WHERE a.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public') --用户表一般存储在public模式下

AND a.relkind='r'

ORDER BY a.relname;

--表信息

select * from pg_tables where schemaname='public' and tableowner='db_name';

--视图的定义

select definition from pg_views where viewname='xxxx' and viewowner='xxxxx';

查看表的建表信息

--法一

SELECT a.attnum,

a.attname AS field,

t.typname AS type,

a.attlen AS length,

a.atttypmod AS lengthvar,

a.attnotnull AS notnull,

b.description AS comment

FROM pg_class c,

pg_attribute a

LEFT OUTER JOIN pg_description b ON a.attrelid=b.objoid AND a.attnum = b.objsubid,

pg_type t

WHERE c.relname = 'xxxxxx'

and a.attnum > 0

and a.attrelid = c.oid

and a.atttypid = t.oid

ORDER BY a.attnum;

--法二

select

col.table_schema,

col.table_name,

col.ordinal_position,

col.column_name,

col.data_type,

col.character_maximum_length,

col.numeric_precision,

col.numeric_scale,

col.is_nullable,

col.column_default,

des.description

from

information_schema.columns col left join pg_description des on

col.table_name::regclass = des.objoid

and col.ordinal_position = des.objsubid

where

table_schema = 'public'

and table_name = 'xxxxxx'

order by

ordinal_position;

生成表的建表语句

CREATE OR REPLACE FUNCTION generate_create_table_statement(p_table_name varchar)

RETURNS text AS

$BODY$

DECLARE

v_table_ddl text;

column_record record;

BEGIN

FOR column_record IN

SELECT

b.nspname as schema_name,

b.relname as table_name,

a.attname as column_name,

pg_catalog.format_type(a.atttypid, a.atttypmod) as column_type,

CASE WHEN

(SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)

FROM pg_catalog.pg_attrdef d

WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN

'DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)

FROM pg_catalog.pg_attrdef d

WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)

ELSE

''

END as column_default_value,

CASE WHEN a.attnotnull = true THEN

'NOT NULL'

ELSE

'NULL'

END as column_not_null,

a.attnum as attnum,

e.max_attnum as max_attnum

FROM

pg_catalog.pg_attribute a

INNER JOIN

(SELECT c.oid,

n.nspname,

c.relname

FROM pg_catalog.pg_class c

LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace

WHERE c.relname ~ ('^('||p_table_name||')$')

AND pg_catalog.pg_table_is_visible(c.oid)

ORDER BY 2, 3) b

ON a.attrelid = b.oid

INNER JOIN

(SELECT

a.attrelid,

max(a.attnum) as max_attnum

FROM pg_catalog.pg_attribute a

WHERE a.attnum > 0

AND NOT a.attisdropped

GROUP BY a.attrelid) e

ON a.attrelid=e.attrelid

WHERE a.attnum > 0

AND NOT a.attisdropped

ORDER BY a.attnum

LOOP

IF column_record.attnum = 1 THEN

v_table_ddl:='CREATE TABLE '||column_record.schema_name||'.'||column_record.table_name||' (';

ELSE

v_table_ddl:=v_table_ddl||',';

END IF;

IF column_record.attnum <= column_record.max_attnum THEN

v_table_ddl:=v_table_ddl||chr(10)||

' '||column_record.column_name||' '||column_record.column_type||' '||column_record.column_default_value||' '||column_record.column_not_null;

END IF;

END LOOP;

v_table_ddl:=v_table_ddl||');';

RETURN v_table_ddl;

END;

$BODY$

LANGUAGE 'plpgsql' COST 100.0 SECURITY INVOKER;

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,首先你需要提供这些字段的信息,例如字段名称、数据类型、是否非空等。 假设你有以下字段信息: - id:数字类型,主键,自增长 - name:字符串类型,非空 - age:数字类型,非空 - gender:字符串类型,可以为空 - address:字符串类型,可以为空 则可以使用以下 SQL 语句来创建名为 `person` 的: ``` CREATE TABLE person ( id serial PRIMARY KEY, name VARCHAR NOT NULL, age INTEGER NOT NULL, gender VARCHAR, address VARCHAR ); ``` 这条语句会创建一个名为 `person` 的,其中有五个字段,分别是 `id`、`name`、`age`、`gender` 和 `address`。`id` 字段是数字类型,并且是主键,设置为自增长。`name` 和 `age` 字段是字符串类型,并且设置为非空。`gender` 和 `address` 字段是字符串类型,并且可以为空。 请注意,这只是一个示例,实际上可能会有更多的字段和更复杂的结构。 希望这对你有帮助! ### 回答2: 生成 PostgreSQL建表语句需要根据给定的字段进行处理。以下是一个示例的程序脚本,用于根据给定的字段生成 PostgreSQL建表语句: ```python def generate_create_table_statement(fields): statement = "CREATE TABLE table_name(\n" for field in fields: statement += f"{field['name']} {field['type']}" if field['length']: statement += f"({field['length']})" if field['primary_key']: statement += " PRIMARY KEY" if not field['nullable']: statement += " NOT NULL" statement += ",\n" statement = statement.rstrip(",\n") # 移除最后一个逗号和换行符 statement += ");" return statement # 示例字段 fields = [ {"name": "id", "type": "INT", "length": None, "primary_key": True, "nullable": False}, {"name": "name", "type": "VARCHAR", "length": 50, "primary_key": False, "nullable": True}, {"name": "age", "type": "INT", "length": None, "primary_key": False, "nullable": True} ] create_table_statement = generate_create_table_statement(fields) print(create_table_statement) ``` 以上代码中,我们定义了一个 `generate_create_table_statement()` 函数,该函数接受字段列作为参数,将这些字段逐个处理拼接到 `CREATE TABLE` 语句中。字段的属性包括字段名 `name`、字段类型 `type`、字段长度 `length`、是否为主键 `primary_key`,以及是否可为空 `nullable`。 使用示例字段生成PostgreSQL 建表语句如下所示: ``` CREATE TABLE table_name( id INT PRIMARY KEY NOT NULL, name VARCHAR(50), age INT ); ``` 你可以将字段列替换为自己的数据,并调用函数 `generate_create_table_statement()` 来生成自定义的 PostgreSQL 建表语句。 ### 回答3: 在生成postgresql建表语句之前,需要了解这些字段的具体信息,包括字段名称、数据类型、长度、约束条件等。以下是一个例子,假设我们有以下字段信息: 字段1:用户ID(user_id),数据类型为整型(int),长度为10,主键(PRIMARY KEY); 字段2:用户名(username),数据类型为字符串型(varchar),长度为50,唯一性约束(UNIQUE); 字段3:年龄(age),数据类型为整型(int),长度为2,非空约束(NOT NULL); 字段4:性别(gender),数据类型为字符串型(varchar),长度为10; 字段5:注册日期(register_date),数据类型为日期型(date)。 根据以上字段生成postgresql建表语句如下: CREATE TABLE 名 ( user_id INT(10) PRIMARY KEY, username VARCHAR(50) UNIQUE, age INT(2) NOT NULL, gender VARCHAR(10), register_date DATE ); 以上语句中,CREATE TABLE示创建一张名可以根据实际情况进行命名。括号内每一行示一个字段,包括字段名称和字段的数据类型及约束条件。其中,INT示整型,VARCHAR示字符串型,PRIMARY KEY示主键,UNIQUE示唯一性约束,NOT NULL示非空约束,DATE示日期型。 根据具体的字段信息,可以根据上述格式进行调整和修改,以生成适合的postgresql建表语句

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值