PostgreSQL获取数据表创建语句

 PostgreSQL获取数据表创建语句如下


SELECT array_to_string( ARRAY (
		SELECT ret  FROM
			(
					SELECT
						'CREATE TABLE 模式名称.表名称 (' || array_to_string(ARRAY (
										SELECT SQL 
										FROM
											(
												(--字段信息
													SELECT array_to_string(ARRAY (
													SELECT A.attname || ' ' || concat_ws ( '', T.typname, SUBSTRING ( format_type ( A.atttypid, A.atttypmod ) FROM '\(.*\)' ) ) || ' ' ||
																CASE A.attnotnull  WHEN 't' THEN 'NOT NULL' ELSE '' END || ' ' ||
																CASE WHEN D.adbin IS NOT NULL THEN ' DEFAULT ' || pg_get_expr ( D.adbin, A.attrelid ) ELSE'' END 
													FROM
														pg_attribute
														A LEFT JOIN pg_description b ON A.attrelid = b.objoid 
														AND A.attnum = b.objsubid
														LEFT JOIN pg_attrdef D ON A.attrelid = D.adrelid 
														AND A.attnum = D.adnum,
														pg_type T 
													WHERE
														A.attstattarget =- 1 
														AND A.attrelid = '模式名称.表名称' :: REGCLASS :: OID 
														AND A.attnum > 0 
														AND NOT A.attisdropped 
														AND A.atttypid = T.OID 
													ORDER BY A.attnum  ),',' || CHR( 10 )  )  SQL, 1 seri 
												) 
												UNION
												(--约束(含主外键)信息
													SELECT 'CONSTRAINT ' || conname || ' ' || pg_get_constraintdef ( OID ) SQL, 2 seri 
													FROM pg_constraint T 
													WHERE conrelid = '模式名称.表名称' :: REGCLASS :: OID 
													ORDER BY contype DESC 
												) 
												ORDER BY seri  
											) T 
									),',' || CHR( 10 )  ) || ')' AS ret, 1 AS orderby 
					UNION --索引信息
							SELECT array_to_string(ARRAY ( 
											SELECT pg_get_indexdef ( indexrelid ) 
											FROM pg_index 
											WHERE indrelid = '模式名称.表名称' :: REGCLASS :: OID 
											AND indisprimary = 'f' 
											AND indisunique = 'f' 
									),';' || CHR( 10 ) ) AS ret,2 AS orderby 
					UNION --注释信息
							SELECT array_to_string(ARRAY (
												SELECT
													'COMMENT ON COLUMN ' || '模式名称.表名称.' || A.attname || ' IS ''' || b.description || '''' 
												FROM pg_attribute A 
												LEFT JOIN pg_description b ON A.attrelid = b.objoid 
													AND A.attnum = b.objsubid 
												WHERE
													A.attstattarget =- 1 
													AND A.attrelid = '模式名称.表名称' :: REGCLASS :: OID 
													AND b.description IS NOT NULL 
												ORDER BY
													A.attnum 
									), ';' || CHR( 10 )  ) AS ret,3 AS orderby 
						ORDER BY orderby 
			) results 
		), ';' || CHR( 10 ) || CHR( 13 ) 
)
 

效果如下

CREATE TABLE public.t_type (ca numeric(6,2)   DEFAULT 123,
cnnull varchar(255) NOT NULL  DEFAULT 'abc'::character varying,
ccheck varchar(255)  ,
cpkey varchar(255) NOT NULL ,
cfkey int4 NOT NULL ,
CONSTRAINT cchk CHECK ((length((ccheck)::text) > 0)),
CONSTRAINT confkey FOREIGN KEY (cfkey) REFERENCES company(id) ON DELETE CASCADE,
CONSTRAINT t1_pkey PRIMARY KEY (cpkey),
CONSTRAINT uniquecolumn UNIQUE (ca));

CREATE INDEX idx ON public.t_type USING btree (ccheck);
CREATE INDEX idx2 ON public.t_type USING btree (cnnull);

COMMENT ON COLUMN "public".t_type.cnnull IS '注释';
COMMENT ON COLUMN "public".t_type.cfkey IS '注释12123'

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值