2012-01-16 63 views
3

这听起来有点不现实,但我最近必须研究远程维护系统的数据库结构,并且它让我感到有一些偶尔当我想要查找链接到给定表的所有列时(请参阅原始开发人员不创建显式关系,而是在列名中编码关系!)。找到一个列名称与特定模式匹配的表格

例如,假设列parent.parent的所有列都具有table.somefield_parent的形式作为记录两个字段之间关系的方法,那么如何使用标准SQL命令查找所有这些关系(以及所涉及的表) /内置功能?

欢迎任何MySQL或PostgreSQL解决方案。

注:

  • 不是在寻找数据中的模式,但在元数据。
  • 我知道我可以转储数据库结构并在那里搜索结果,但我不想走出db-shell找到这些关系(假设我在说psql,并且不想退出)

回答

1

有用的PostgreSQL可以查询系统目录表。

您还可以查询information_schema,它由提供显示信息的标准SQL方式的视图组成。尽管如此,查询系统目录通常要快得多。

为了找到一个特定parent列的孩子:

SELECT n.nspname AS parrent_schema 
    , c.relname AS parrent_table 
    , a.attname AS parrent_column 
    , n1.nspname AS child_schema 
    , c1.relname AS child_table 
    , a1.attname AS child_column 
FROM pg_catalog.pg_attribute a 
JOIN pg_catalog.pg_class c ON c.oid = a.attrelid 
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
JOIN pg_catalog.pg_attribute a1 ON a.attname = substring(a1.attname, '_(.*?)$') 
JOIN pg_catalog.pg_class c1 ON c1.oid = a1.attrelid 
JOIN pg_catalog.pg_namespace n1 ON n1.oid = c1.relnamespace 
WHERE c.relkind = 'r' 
AND c1.relkind = 'r' 
AND n.nspname !~~ E'pg\\_%' 
AND n1.nspname !~~ E'pg\\_%' 
AND NOT a.attisdropped 
AND NOT a1.attisdropped 
-- AND n.nspname = 'public' -- to narrow it down to a specific schema 
-- AND n1.nspname = 'public' -- to narrow it down to a specific schema 
ORDER BY 1,2,3,4,5,6 

这假定parrent列没有:

SELECT n.nspname AS schema_name 
    , c.relname AS table_name 
    , a.attname AS column_name 
FROM pg_catalog.pg_attribute a 
JOIN pg_catalog.pg_class c ON c.oid = a.attrelid 
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE a.attname ~~ E'%\\_parent' 
AND NOT a.attisdropped 
AND c.relkind = 'r' 
AND nspname !~~ E'pg\\_%'; 

要根据描述找到所有列相关_的名字。
关键因素是连接条件:

a.attname = substring(a1.attname, '_(.*?)$') 
0

如果您使用MySQL,则可以使用数据库information_schema。该数据库包含该服务器上数据库的所有元数据。据我所知,每个数据库用户都必须有权访问该数据库。

7

试试查询information_schema.columns视图。它在MySQL中工作,但我没有在Postgres中尝试过。 information_schema模式是ANSI SQL标准的一部分,因此Postgres很可能也会拥有它。

information_schema其他意见包括information_schema.tables,这也

+0

'information_schema.columns' PostgreSQL中也有效。 – 2012-01-16 08:46:41

+0

感谢您的信息。很高兴知道。 – 2012-01-16 09:25:39

+3

我做了类似'select table_name,column_name from information_schema.columns where column_name like'%_parent'and table_catalog ='sat';',它解决了我的问题。谢谢 – nemesisfixx 2012-01-16 10:14:10

相关问题