2012-01-16 2 views
3

이것은 조금 비현실적 이겠지만, 최근에는 원격으로 유지 관리하는 시스템의 데이터베이스 구조를 연구해야만하고 몇 가지 경우가 있음을 알게되었습니다 주어진 테이블에 링크 된 모든 컬럼을 찾고 싶을 때 (원래의 개발자는 명시 적 관계를 생성하지 않고 대신 컬럼 이름에 관계를 인코딩했습니다!).주어진 패턴과 일치하는 열 이름을 가진 테이블 찾기

예를 들어, 두 필드 사이의 관계를 문서화하는 수단으로 parent.parent 열을 참조하는 모든 열을 양식으로 가정하면 표준 SQL 명령을 사용하여 이러한 관계/내장 함수?

MySQL 또는 PostgreSQL에 대한 모든 솔루션을 환영합니다.

참고 :

  • 는하지만, 메타 데이터, 데이터의 패턴을 찾고 있지 않다.
  • DB 구조를 덤프하고 거기에서 결과를 검색 할 수 있지만 이러한 관계를 찾기 위해 db-shell을 사용하고 싶지 않습니다. (psql을 사용한다고 가정하고 싶지는 않습니다. exit)

답변

1

으로 유용 information_schema.tables를 포함한다.

정보를 표시하는 표준 SQL 방식을 제공하는보기로 구성된 information_schema를 쿼리 할 수도 있습니다. 시스템 카탈로그 쿼리는 일반적으로 훨씬 빠릅니다.

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\\_%'; 

의 설명에 따라 모든 관련 열을 찾으려면 :

은 하나 개의 특정 parent 컬럼의 아이를 찾으려면 이름에 _.

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

MySQL을 사용하는 경우 데이터베이스 information_schema를 사용할 수 있습니다. 이 데이터베이스는 해당 서버의 데이터베이스에 대한 모든 메타 데이터를 포함합니다. 내가 아는 한 모든 데이터베이스 사용자는 해당 데이터베이스에 액세스해야합니다.

7

information_schema.columns보기를 쿼리 해보십시오. 그것은 MySQL에서 작동하지만 Postgres에서 시도하지 않았습니다. information_schema 스키마는 ANSI SQL 표준의 일부이므로 Postgres는이를 가지고있을 것입니다. information_schema에서

다른 뷰는 시스템 카탈로그 테이블을 조회 할 수 있습니다 PostgreSQL을에서 잘

+0

'뿐만 아니라 PostgreSQL의 작동 information_schema.columns' :
핵심 요소는 조인 조건이다. –

+0

정보를 제공해 주셔서 감사합니다. 알아 둘만한. –

+3

나는'% _parent '와 table_catalog ='sat ';와 같이 column_name이 information_schema.columns에서'select table_name, column_name'과 같은 것을하고 내 문제를 해결했습니다. 감사 – nemesisfixx