>

이 필드 이름, 테이블 이름 (이 필드가있는) 및 스키마를 사용하여 테이블 (외부 키 테이블)의 특정 필드에서 참조 된 테이블 이름 (기본 키 테이블 이름)을 찾아야하는 요구 사항이 있습니다. 이름 (테이블과 필드가있는 위치)

예 :

Schema1.TableA
  Id (Integer, PK)  
  Name varchar

Schema2.TableB
  Id (integer, PK)  
  A_Id (integer, FK referencing TableA.Id)  
  Name varchar 

A_Id 를 통과해야합니다 TableB  그리고 Schema2  함수에 Schema1.TableA 를 얻을  결과적으로

Postgres 8.3을 사용하고 있습니다.

  • 답변 # 1

    이를 다른 RDBMS로 이식 할 필요가 없다면 pg_catalog 에서 카탈로그 테이블을 사용하는 것이 훨씬 빠르고 간단합니다.  표준 정보 스키마 대신 :

    SELECT c.confrelid::regclass::text AS referenced_table
         , c.conname AS fk_name
         , pg_get_constraintdef(c.oid) AS fk_definition
    FROM   pg_attribute a 
    JOIN   pg_constraint c ON (c.conrelid, c.conkey[1]) = (a.attrelid, a.attnum)
    WHERE  a.attrelid = '"Schema2"."TableB"'::regclass   -- table name
    AND    a.attname  = 'A_Id'                           -- column name  
    AND    c.contype  = 'f'
    ORDER  BY conrelid::regclass::text, contype DESC;
    
    

    반환 :

    referenced_table | fk_name  |  fk_definition
    ------------------+-------------------------+----------------------------------------------
     Schema1.TableA   | b1_fkey  | FOREIGN KEY ("B_id") REFERENCES "Schema1"."TableA"("A_id")
    
    

    참고 사항

    추가적인 두 열은 방향만을위한 것입니다. Q에 따르면 첫 번째 열만 필요합니다.

    여러 열에 대한 FK 제약 조건을 포함하여 주어진 열 이름과 관련된 모든 외래 키로모든참조 테이블을 반환합니다.

    이름은 현재 search_path 가 설정 한 가시성에 따라 자동으로 스키마 규정되거나 그렇지 않습니다 . 필요한 경우 이름도 자동으로 이스케이프 처리됩니다 (불법 또는 대문자, 예약어 등).

    pg_constraint 의 세부 사항을 확인하십시오  그리고 pg_attribute  매뉴얼에서. 그리고 객체 식별자 유형에 대한 자세한 내용.

    관련 :

    알 수없는 이름의 PostgreSQL 삭제 제약 조건

    모든 PK 및 FK 검색

관련 자료

  • 이전 자바 스크립트는 두 날짜를 비교하여 차이를 얻습니다
  • 다음 android - ProgressDialog를 추가하는 방법