当我们知道序列名称,我们想获取是哪个表或者表上的哪个列在使用这个序列,目前在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
可以看到查出了所有的序列与表列之间的信息。
接下来我们根据某个序列名来查询。
封装带参数的快捷命令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
保持联系
从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个PG乐知乐享交流群,欢迎关注我文章的小伙伴进群吹牛唠嗑,交流技术,互赞文章。
如果群二维码失效可以加我微信。
最后修改时间:2022-10-23 10:31:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。