postgresql 数据库 删除所有注释

624 阅读2分钟

本文已参与「新人创作礼亅活动,一起开启掘金创作之路。

postgresql 数据库 删除所有注释

在工作中常常遇到特殊情况 ,我这次就是碰到要求是删除数据库中的所有注释 (表注释和列注释) 注释一条条的删除太麻烦了 我们可以批量删除注释 在Oracle 数据库中可以 通过user_col_comments 这个表来实现删除注释

select 'comment on column '||t.table_name||'.'||t.column_name||' is '''';' from user_col_comments t; 

但是在postgresql 数据库中是没有一个类似的表 但是我们也可以通过语句来实现这个功能 postgresql 数据库 有 pg_class 和 pg_namespace 表

pg_class 记录表和几乎所有具有列或者像表的东西。 这包括索引(但还要参 见 pg_index )、序列 ( pg_sequence )、视图、物化视图、组合类型和 TOAST 表,参 见 relkind 。

pg_namespace 存储名字空间。名字空间是 SQL 模式之下的结构:每个名字空间拥有一个 独立的表、类型等的集合,且其中没有名字冲突

详情可以参考pg_class https://blog.csdn.net/pg_hgdb/article/details/79455123?utm_source=copy pg_namespace

通过这两个表我们就能实现Oracle中的user_col_comments表的功能了 **

1.删除表的注释

** 首先 我们需要确定我们需求: 模式名,表名,注释 然后拼接成语句

SELECT
	n.nspname,
	relname AS tabname,
	obj_description ( relfilenode, 'pg_class' ) AS COMMENT,
	concat_ws ( '', 'COMMENT ON TABLE "', nspname, '"."', relname, '" is '''';' ) 
FROM
	pg_class
	C LEFT JOIN pg_catalog.pg_namespace n ON n.oid = C.relnamespace 
WHERE
	relkind = 'r' 
	AND obj_description ( relfilenode, 'pg_class' ) IS NOT NULL;

因涉及公司机密做了模糊处理 因涉及公司机密做了模糊处理

nspname  --表所在的模式
tabname --表名
comment  --表注释
concat_ws --要执行的语句

**

2.删除列的注释

** 想法跟表的一样,这里就不说了

SELECT
	nspname,
	b.TABLE_NAME,
	A.attname,
	col_description ( A.attrelid, A.attnum ) AS COMMENT,
	concat_ws ( '', 'COMMENT ON COLUMN ', nspname, '.', b.TABLE_NAME, '.', A.attname, ' is '''';' ) 
FROM
	pg_catalog.pg_attribute A,
	(
	SELECT C
		.oid,
		C.relname AS TABLE_NAME,
		n.nspname 
	FROM
		pg_catalog.pg_class
		C LEFT JOIN pg_catalog.pg_namespace n ON n.oid = C.relnamespace 
	WHERE
		C.relkind = 'r' 
	) b 
WHERE
	A.attrelid = b.oid 
	AND A.attnum > 0 
	AND NOT A.attisdropped 
	AND col_description ( A.attrelid, A.attnum ) IS NOT NULL 
ORDER BY
	b.TABLE_NAME,
	A.attnum;

在这里插入图片描述 3.执行语句 有了删除语句你就可以复制,粘贴 然后执行语句了 如果表太多可以写个函数自动执行...