다른 테이블에서 모든 열 업데이트


13

다른 테이블에서 테이블을 업데이트해야하며 모든 열을 업데이트해야합니다. SET절의 모든 열을 나열하는 것 외에도 한 번에 모두 업데이트하는 방법이 있습니까? 이처럼 :

update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id

psql에서 시도했지만 작동하지 않습니다. 다음과 같이 모든 열을 나열해야합니다.

update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id

tableB사용하여 생성됩니다 create .. like tableA. 따라서 기본적으로 동일합니다. 그리고 내가하는 이유는 .csv 데이터를 임시 테이블에로드 tableB한 다음 tableA의 새 데이터를 기반으로 업데이트 해야하기 때문 입니다 tableB. tableA가능한 한 적게 잠겨 tableA무결성을 유지해야합니다. '삭제 후 삽입'이 좋은 옵션인지 잘 모르겠습니다.


1
두 번째 코드로 테스트했는데 작동합니다! 다음 두 가지 주제를 검토해야합니다. dba.stackexchange.com/questions/58371/… , dba.stackexchange.com/questions/59458/…
Luan Huynh

답변:


12

전체 행을 한 번에 업데이트 할 수있는 구문 변형 이 없습니다 . 그러나 지금까지의 것보다 짧은 형식이 있습니다.

또한 실제로 모든 열을 업데이트하고 싶지는 않습니다. WHEREid 의 조건 id은 변경되지 않은 채 하나 이상의 열 ( )을 줄입니다. 그러나 그것은 단지 nitpicking입니다.

UPDATE table_a a
SET    (  c1,   c2, ...)
     = (b.c1, b.c2, ...)
FROM   table_b b
WHERE  a.id = b.id;

이 관련 답변에 대한 자세한 내용 :
모든 열의 대량 업데이트

DELETE / INSERT

내부적 으로 PostgresMVCC 모델 로 인해 모든 UPDATE새 행을 효과적으로 삽입하고 이전 행을 더 이상 사용하지 않는 것으로 표시합니다. 따라서 커튼 뒤에는 + UPDATE와 큰 차이가 없습니다 . 있다 몇몇 의 찬성 세부 경로 : DELETEINSERT
UPDATE

  • 최신 업데이트.
  • TOAST 테이블 : 열이 큰 경우 TOAST 테이블에 내용이 "아웃-라인"으로 저장 될 수 있으며 토스트 된 열이 변경되지 않은 경우 새 행 버전이 TOAST 테이블의 동일한 행에 링크 될 수 있습니다.
  • 인덱스 유지 관리 비용이 저렴할 수 있습니다.

그렇지 않으면 잠금은 거의 같아야합니다. 어느 쪽이든 영향을받는 행에 독점 잠금이 필요합니다. 빨리 해
많은 수의 행을 처리하고 일관된 상태가 필요하지 않은 경우 (모든 행 또는 없음), 작업을 여러 배치로 분할 할 수 있습니다. (별도의 트랜잭션!) 총 비용은 증가하지만 행당 잠금 시간은 짧게 유지합니다.


3
DELETE / INSERT또한 원하지 않는 효과 또는 다른 효과 (캐스케이드 또는 트리거)를 가질 수 있습니다 UPDATE.
ypercubeᵀᴹ

정확하지만 table_a의 별칭 부분을 업데이트해야합니다. table_a (테이블이 업데이트 됨)는 별명을 얻을 수 없습니다.
또 다른 코드 애인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.