내가 알지 못하는 데이터베이스에서 정확한 정보를 찾고 있습니다.
제 3 자 제품이고 몇 가지 질문에 대한 답변이 느리고 데이터가 해당 db에 있다는 것을 알고 있으므로 약간의 레트로 엔지니어링을 수행하고 싶습니다.
Given 하나의 테이블,이 테이블의 열 이름 목록을 가질 수 있습니까?
예를 들어 SqlServer에서는 테이블을 재사용 가능한 문, 표가 구성된 모든 열을 텍스트로 나열합니다.
설명
답변
이미 찾은 명령 줄 \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))
psql
에서\dt[+] table_name
뒤에 있습니다.