지정된 테이블에 대한 모든 열을 나열하려면 어떻게해야합니까?

내가 알지 못하는 데이터베이스에서 정확한 정보를 찾고 있습니다.

제 3 자 제품이고 몇 가지 질문에 대한 답변이 느리고 데이터가 해당 db에 있다는 것을 알고 있으므로 약간의 레트로 엔지니어링을 수행하고 싶습니다.

Given 하나의 테이블,이 테이블의 열 이름 목록을 가질 수 있습니까?

예를 들어 SqlServer에서는 테이블을 재사용 가능한 문, 표가 구성된 모든 열을 텍스트로 나열합니다.

설명

  • 어떤 종류의 액세스 권한이 있습니까? DB?
  • @dezso, 별도의 시스템에 있지만 로그인하여 관리자 권한으로 psql 명령 줄을 실행할 수 있습니다.
  • 정확히 이해하면 psql에서 \dt[+] table_name 뒤에 있습니다.
  • 아니요. \ dt +는 열 이름을 명시 적으로 표시하지 않는 것 같습니다. " 설명 " 필드 만 추가합니다.
  • 그러나 \ d + 테이블 이름은 작동합니다!

답변

이미 찾은 명령 줄 \d+ <table_name> 외에도 다음을 수행 할 수 있습니다. 또한 정보 스키마 를 사용하여 information_schema.columns :

SELECT * FROM information_schema.columns WHERE table_schema = "your_schema" AND table_name = "your_table" ; 

참고 : 위의 예에 따라 값은 따옴표로 묶어야합니다.

댓글

  • psql에서 \x on 또는 \pset expanded on를 사용하여 쿼리를 작성합니다. 결과는 표 형식이 아니라 선형이므로 읽기가 더 쉽습니다. stackoverflow.com/a/9605093/513397
  • 현재 버전에서 9.6에서) psql \d+ public.*에서 수행하여

스키마. 커밋 전 후크 스크립트에서이를 사용하여 각 커밋에 의해 DB의 변경 사항을 추적합니다.

  • 열 이름 만 가져 오려면 column_name 선택
  • Answer

    다른 답변을 보완하기 위해 행을 반환하지 않는 SELECT 문조차도 열 이름을 사용자와 애플리케이션 코드에 노출합니다.

    p>

    select * from table_name where false; 

    이러한 접근 방식에서 권한이 작용할 수 있습니다.

    댓글

    • 이 SQL을 psql 명령에 전달하려는 것으로 가정합니다. 이 경우 출력에서 놀라움을 피하기 위해 –no-psqlrc 옵션을 사용하는 것이 좋습니다.
    • 선택해야하는 숨겨진 열을 제외하고 (pg_class.oid와 같은)

    답변

    정보 스키마 는 느리고 확실한 방법입니다. 표준화되고이를 지원하는 다른 데이터베이스로 대체로 이식 할 수 있습니다. 그리고 주요 버전에서도 계속 작동합니다.

    그러나 정보 스키마의 보기 는 종종 시스템 카탈로그 의 많은 테이블이 엄격하게 표준화 된 형식-대부분의 경우 대부분 죽은화물에 불과합니다. 이로 인해 느리게 .
    Postgres 개발자는 약속을하지 않고 기본 (여기에 필요한 것과 같은) 주요 버전 간에는 변경되지 않습니다.

    psql (기본 명령 줄 인터페이스)는 물론 빠른 경로를 사용하고 소스를 직접 쿼리합니다. . 매개 변수 -E 를 사용하여 psql를 시작하면 SQL이 \d와 같은 백 슬래시 명령이 표시됩니다. 또는 psql 명령 줄에서 \set ECHO_HIDDEN on. 거기에서 시작하여 질문에 대한 답을 작성할 수 있습니다.

    한 테이블이 주어지면 이에 대한 열 이름 목록을 가질 수 있습니까? 테이블.

    SELECT attrelid::regclass AS tbl , attname AS col , atttypid::regtype AS datatype -- more attributes? FROM pg_attribute WHERE attrelid = "myschema.mytable"::regclass -- table name, optionally schema-qualified AND attnum > 0 AND NOT attisdropped ORDER BY attnum; 

    쿼리

    . 직접 확인하려면 EXPLAIN ANALYZE를 사용해보세요. 일회성 조회에는 여전히 중요하지 않습니다. 하지만 여러 번 반복되는 쿼리 / 함수에서 사용하면 차이가 날 수 있습니다.

    또한 가시성에도 미묘한 차이가 있습니다. 자세한 비교 :

    댓글

    • -E를 보여주고 사람들에게 psql의 SQL을 얻는 방법을 보여준 것을 정말 좋아합니다.
    • 동의합니다.몇 가지 속도 테스트를 실행했는데 pg_catalog가 2 배 이상 빠르게 실행됩니다

    Answer

    psql PostgreSQL 11 이상

    쿼리에서 열 유형을 찾으려면 psql “의 \gdesc

    SELECT NULL AS zero, 1 AS one, 2.0 AS two, "three" AS three, $1 AS four, sin($2) as five, "foo"::varchar(4) as six, CURRENT_DATE AS now \gdesc Column | Type --------+---------------------- zero | text one | integer two | numeric three | text four | text five | double precision six | character varying(4) now | date (8 rows) 

    답변

    PostgreSQL 만 해당

    이것은 다소 까다로운 일이지만 가능한 가장 짧은 SQL을 찾고 있다면 경쟁자가 될 수 있습니다.

    SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, "{}"::JSON))) 

    또는 더 짧습니다 (테이블에 하나 이상의 행이 있다고 가정).

    SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1))) 

    목록은 주문을 유지합니다. 주문에 신경 쓰지 않고 hstore 확장 프로그램을 설치 한 경우 더 짧게 할 수 있습니다.

    SELECT skeys(hstore(NULL::schema_name.table_name)) 

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다