2012-01-16 66 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

相關問題