Postgresql允许向表等对象添加注释.例如,我使用此SQL命令向表"mytable"添加了注释:
COMMENT ON TABLE mytable IS 'This is my table.';
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果我想使用SQL命令获取所有表及其各自的注释 - 我将如何做到这一点?什么是适当的查询?
提前致谢!干杯!
a_h*_*ame 41
所有注释都存储在pg_description中
要获取表的注释,需要将其连接到pg_class
作为替代方案,您还可以使用该函数obj_description()来检索此信息:
SELECT obj_description(oid)
FROM pg_class
WHERE relkind = 'r'
Run Code Online (Sandbox Code Playgroud)
编辑
在psql中,您只需使用该\d+命令即可显示所有表,包括其注释.或使用该\dd命令显示系统中的所有注释
Ejr*_*085 13
您可以使用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';
Run Code Online (Sandbox Code Playgroud)
MySQL、PostgreSQL 中的 INFORMATION_SCHEMA 支持
“显示评论”的主要问题是记住特定功能的名称、目录名称等以检索评论...或其在指南上的页面。在这个答案中,我们以两种方式解决:
通过总结普通方式(pg-way)来显示评论;
并通过提供快捷功能,减少“记忆问题”。
在最简单的,对psql,就是用\dt+显示表的意见和\d+显示专栏评论。一些用于功能注释?
要了解 SQL,并且对于记住所有参数的人,pg 方法是将obj_description()函数 ( Guide ) 与足够的reg类型结合使用:
功能:select obj_description('mySchema.myFunction'::regproc, 'pg_proc')
表或视图:(
“......以及大多数其他具有列或与表相似的所有内容”,指南)
select obj_description('mySchema.myClass'::regclass, 'pg_class')
其他通用:select obj_description('mySchema.myObject'::regName, pg_regName),其中regName是 10分之1 的datatype-oid 引用 Guide,并且pg_regName是相同的,用 prefix 替换regprefix pg_。
其他特定的:similar select obj_description('schema.myObject'::regName, catalog_name),其中catalog_name是关于catalogs Guide 中的(1 in 95)关键字更具体的。它可以减少一些“命名空间污染”。例如pg_proc对于函数,pg_aggregate对于聚合函数。
获取共享数据库对象的注释,模拟但使用该函数shobj_description()(同一页指南)。
列: select col_description('mySchema.myObject'::regClass, column_number),其中column_number是列的序号位置(在 CREATE TABLE 处)。
没有列名...见col_description(table,column_name)补充波纹管。
重要提示:使用相同的reg -type 和 _catalog_name_(例如 ::regclassand pg_class)似乎是多余的,有时obj_description('obj'::regObj) 工作正常,只有reg -type!...但是,正如指南所说:
它已被弃用,因为不能保证 OID 在不同的系统目录中是唯一的;因此,可能会返回错误的评论。
如果你发现很难记住所有的类型转换和参数,最好是采用一个新的和最简单的函数来检索评论。
CREATE FUNCTION rel_description(
p_relname text, p_schemaname text 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')
Run Code Online (Sandbox Code Playgroud)
我们还需要一些不那么难看的东西来显示专栏评论。没有任何pg_get_serial_sequence()函数可以从名称中获取列的顺序位置。本机col_description('mySchema.myObject'::regClass, column_number)
需要一个补充:
CREATE FUNCTION col_description(
p_relname text, -- table name or schema.table
p_colname text, -- table's column name
p_database text DEFAULT NULL -- NULL for current
) RETURNS text AS $f$
WITH r AS (
SELECT CASE WHEN array_length(x,1)=1 THEN array['public',x[1]] ELSE x END
FROM regexp_split_to_array(p_relname,'\.') t(x)
)
SELECT col_description(p_relname::regClass, ordinal_position)
FROM r, information_schema.columns i
WHERE i.table_catalog = CASE
WHEN $3 IS NULL THEN current_database() ELSE $3
END and i.table_schema = r.x[1]
and i.table_name = r.x[2]
and i.column_name = p_colname
$f$ LANGUAGE SQL;
-- SELECT col_description('tableName','colName');
-- SELECT col_description('schemaName.tableName','colName','databaseName);
Run Code Online (Sandbox Code Playgroud)
笔记:
正如此答案所建议的:“如果您想知道在执行 \dt+ 或 \d+ 客户时 psql 运行哪些查询,只需使用psql -E“启动它。
可以使用任何多行字符串(带有 E\n或$$...$$)来表达多行注释……
但是您不能应用trim()或使用另一个动态方面。必须在COMMENT子句上使用动态 SQL。
没有评论看?PostgreSQL 程序员不使用COMMENT子句,因为它使用起来很丑陋:没有语法可以在 CREATE TABLE 或CREATE FUNCTION上添加注释;并且没有好的 IDE 可以自动化它。
现代http://postgREST.org/界面在网络上显示评论!