테이블 그대로 작성 및 선택 CREATE TABLE AS -질의 결과에서

PostgreSQL의 지원 CREATE TABLE ASSELECT INTO나는 모두를 할 때 사용합니까?

CREATE TABLE AS -질의 결과에서 새로운 테이블을 정의

CREATE TABLE AS테이블을 작성하고 SELECT명령으로 계산 된 데이터로 채 웁니다 . 테이블 컬럼에는 출력 컬럼과 연관된 이름 및 데이터 유형 SELECT이 있습니다 (명시 적으로 새로운 컬럼 이름 목록을 제공하여 컬럼 이름을 대체 할 수있는 경우는 제외).

CREATE TABLE AS뷰를 만드는 것과 비슷하지만 실제로는 다릅니다. 새 테이블을 만들고 쿼리를 한 번만 평가하여 새 테이블을 처음에 채 웁니다. 새 테이블은 후속 쿼리 소스 테이블 변경 사항을 추적하지 않습니다. 반대로, 뷰 SELECT는 쿼리 할 때마다 정의 문을 다시 평가합니다 .

그리고.

SELECT INTO -질의 결과에서 새로운 테이블을 정의

SELECT INTO새 테이블을 만들고 쿼리로 계산 된 데이터로 채 웁니다. 데이터는 normal이기 때문에 클라이언트에 반환되지 않습니다 SELECT. 새 테이블의 열에는의 출력 열과 연관된 이름 및 데이터 유형이 SELECT있습니다.



답변

설명이 없으면 항상 CREATE TABLE AS예외없이 사용하십시오 . NOTES 아래의 각 하단에 정리되어 있습니다.

노트 SELECT INTO,

CREATE TABLE AS기능적으로와 비슷합니다 SELECT INTO. CREATE TABLE AS이 형식은 SELECT INTOECTO 또는 PL / pgSQL에서 사용할 수 없으므로 INTO 절을 다르게 해석하므로 권장되는 구문 입니다. 또한에서 CREATE TABLE AS제공하는 기능의 상위 집합을 제공합니다 SELECT INTO.

노트 CREATE TABLE AS,

이 명령은 기능적으로와 비슷 SELECT INTO하지만 다른 SELECT INTO구문 사용과 혼동 될 가능성 으므로 선호 됩니다. 또한에서 CREATE TABLE AS제공하는 기능의 상위 집합을 제공합니다 SELECT INTO.

또한 문서의 호환성 섹션에서 SELECT INTO더 나아가

SQL 표준은 SELECT INTO새 테이블을 작성하지 않고 호스트 프로그램의 스칼라 변수로 값을 선택하는 데 사용 합니다. ECPG (34 장 참조)와 PL / pgSQL (41 장 참조)에서 사용 된 사용법입니다. 테이블 생성을 나타내는 PostgreSQL 사용법 SELECT INTO은 역사적입니다. CREATE TABLE AS이 목적을 위해 새 코드에서 사용 하는 것이 가장 좋습니다 .

우리는

  1. PostgreSQL은 SELECT INTOPL / pgSQL 및 ECPG에서만 사용 가능한 컨텍스트에서 다른 작업을 수행 하기 때문에 혼란스러워한다고 생각합니다 .
  2. CREATE TABLE더 많은 기능을 지원합니다 ( WITH OIDSTABLESPACE, 및을 참조한다고 가정합니다 IF NOT EXISTS).
  3. SELECT INTO 테이블 작성은 “더 이상 사용되지 않습니다”.

참고로, CTE가 있는 CTAS 의 구문 은 약간 이상하게 보일 수 있습니다. , QUEL ‘s에 대한 일종의 보류 SELECT INTO 수도 있습니다 . QUEL은 PostgreSQL (INGRES)의 선행 작업이 사용했던 SQL의 선행 작업이었습니다.RETRIEVE INTO


답변

허용 된 답변에서 누락 된 것으로 나타났습니다. 를 사용하면에
CREATE TABLE AS의해 무시되는 것처럼 보이는 각 열의 nullable 속성이 유지됩니다 SELECT INTO.

이것만으로도 좋습니다 CREATE TABLE AS. 두 명령문의 일반적인 사용 사례는 쿼리 지속 시간 동안 해당 테이블을 잠그지 않고 오래 실행되는 쿼리에서 테이블로 데이터를로드하는 것입니다. 위 명령 중 하나를 사용하여 임시 테이블을 작성하고 장기 실행 쿼리 결과를 여기에 넣은 다음 해당 결과를 원래 테이블에 삽입하십시오. 임시 테이블에서 널 입력 가능 속성을 유지하면 두 번째 삽입이 실패 할 가능성이 줄어 듭니다.

PG 11에서 이것을 테스트 했으므로이 질문에 대한 답을 얻은 이후의 새로운 기능 일 것입니다.


답변