暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL使用序列名获取表及列信息

原创 多米爸比 2021-11-29
3626

当我们知道序列名称,我们想获取是哪个表或者表上的哪个列在使用这个序列,目前在PG里并没有元命令可以直接查询,pg_class或者pg_sequence系统表也没有记录。

可以使用下面的语句进行查询

select ts.nspname as object_schema,
        tbl.relname as table_name, 
       col.attname as column_name,
       s.relname   as sequence_name
from pg_class s
  join pg_namespace sn on sn.oid = s.relnamespace 
  join pg_depend d on d.refobjid = s.oid and d.refclassid='pg_class'::regclass 
  join pg_attrdef ad on ad.oid = d.objid and d.classid = 'pg_attrdef'::regclass
  join pg_attribute col on col.attrelid = ad.adrelid and col.attnum = ad.adnum
  join pg_class tbl on tbl.oid = ad.adrelid 
  join pg_namespace ts on ts.oid = tbl.relnamespace 
where s.relkind = 'S'
--  and s.relname = 'sequence_name'
  and d.deptype in ('a', 'n');

另外我们也可以借助.psqlrc文件封装快捷命令来进行调用

.psqlrc文件内容格式

\set short_command 'SQL; '

封装不带参数的快捷命令get_table_name_by_seq

下面需要注意一下SQL里面如果有字符串常量需要双写单引号。或者使用单引号前面加转移字符“\”,也可以使用一对双“$”符号进行包裹。

\set get_table_name_by_seq 'select ts.nspname as object_schema,tbl.relname as table_name, col.attname as column_name,s.relname   as sequence_name from pg_class s  join pg_namespace sn on sn.oid = s.relnamespace  join pg_depend d on d.refobjid = s.oid and d.refclassid=''pg_class''::regclass  join pg_attrdef ad on ad.oid = d.objid and d.classid = ''pg_attrdef''::regclass  join pg_attribute col on col.attrelid = ad.adrelid and col.attnum = ad.adnum  join pg_class tbl on tbl.oid = ad.adrelid  join pg_namespace ts on ts.oid = tbl.relnamespace where s.relkind = ''S'' and d.deptype in (''a'', ''n'');'

将上面的内容编辑保存到.psqlrc文件后重新使用psql工具连接测试

:get_table_name_by_seq

image.png
可以看到查出了所有的序列与表列之间的信息。

接下来我们根据某个序列名来查询。

封装带参数的快捷命令get_table_name_by_seqname

注意下面SQL里面传字符串参数需要使用冒号,另外参数名称前后需要使用三个单引号或者前后加’

\set get_table_name_by_seqname 'select ts.nspname as object_schema,tbl.relname as table_name, col.attname as column_name,s.relname   as sequence_name from pg_class s  join pg_namespace sn on sn.oid = s.relnamespace  join pg_depend d on d.refobjid = s.oid and d.refclassid=''pg_class''::regclass  join pg_attrdef ad on ad.oid = d.objid and d.classid = ''pg_attrdef''::regclass  join pg_attribute col on col.attrelid = ad.adrelid and col.attnum = ad.adnum  join pg_class tbl on tbl.oid = ad.adrelid  join pg_namespace ts on ts.oid = tbl.relnamespace where s.relkind = ''S'' and d.deptype in (''a'', ''n'') and s.relname = :'''v_seqname''' ; '

将上面的内容编辑保存到.psqlrc文件后重新使用psql工具连接测试
我们先需要设置变量参数值

\set v_seqname t_id_seq

然后调用快捷命令

:get_table_name_by_seqname

image.png

保持联系

从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个PG乐知乐享交流群,欢迎关注我文章的小伙伴进群吹牛唠嗑,交流技术,互赞文章。

123.png

如果群二维码失效可以加我微信。

456.png

最后修改时间:2022-10-23 10:31:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论