Postgresql允许向诸如表之类的对象添加注释。例如,我使用此SQL命令在表“mytable”中添加了注释:
COMMENT ON TABLE mytable IS 'This is my table.';
我的问题是: 如果我想使用SQL命令获取所有表及其各自的注释 - 我将如何做到这一点?对此有什么合适的查询?
提前致谢! 干杯!
答案 0 :(得分:37)
所有评论都存储在pg_description
中要获得对表格的评论,您需要将其加入pg_class
作为替代方案,您还可以使用函数obj_description()
来检索此信息:
SELECT obj_description(oid)
FROM pg_class
WHERE relkind = 'r'
修改强>
在psql中,您只需使用\d+
命令即可显示所有表,包括其注释。或使用\dd
命令显示系统中的所有注释
答案 1 :(得分:4)
我正在为obj_description
使用一个有用的别名(façade),这很容易使用,因为表名(relname
)是一个varchar并且可以表达带有模式名称的分隔字段,如主表和查询中所示。
CREATE FUNCTION rel_description(
p_relname varchar, p_schemaname varchar DEFAULT NULL
) RETURNS text AS $f$
SELECT obj_description((CASE
WHEN strpos($1, '.')>0 THEN $1
WHEN $2 IS NULL THEN 'public.'||$1
ELSE $2||'.'||$1
END)::regclass, 'pg_class');
$f$ LANGUAGE SQL;
-- EXAMPLES OF USE:
-- SELECT rel_description('mytable');
-- SELECT rel_description('public.mytable');
-- SELECT rel_description('otherschema.mytable');
-- SELECT rel_description('mytable', 'otherschema');
-- PS: rel_description('public.mytable', 'otherschema') is a syntax error,
-- but not generates exception: returns the same as ('public.mytable')
注意:
评论生成with the table name,而不是OID ...“如何使用表名检索评论?”
SELECT obj_description('schemaName.tableName':: regclass,'pg_class');
关于只有object_oid(例如393862),obj_description(393862)
,it is deprecated的obj_description,正确的是
SELECT obj_description(393862,'pg_class');
根据this answer的建议:“如果您想知道在执行\ dt +或\ d +客户时psql运行了哪些查询,只需使用psql -E
”
PS:感谢@a_horse_with_no_name。
答案 2 :(得分:1)
您可以使用pg_catalog.obj_description
函数和information_schema.tables
模式视图:
SELECT t.table_name, pg_catalog.obj_description(pgc.oid, 'pg_class')
FROM information_schema.tables t
INNER JOIN pg_catalog.pg_class pgc
ON t.table_name = pgc.relname
WHERE t.table_type='BASE TABLE'
AND t.table_schema='public';