PostgreSQL UNIQUE 값을 맞바꾸는데 첫 UPDATE가 실패한다
두 행의 UNIQUE 값을 순서대로 맞바꿀 때는 최종 중복이 없어도 첫 UPDATE가 실패한다. 실제 제약의 지연 가능 여부를 조회하고 해당 제약만 DEFERRED로 바꾸는 교환문을 설명한다. PostgreSQL 18.6에서 교환 성공과 COMMIT·IMMEDIATE의 중복 거절을 확인했다.
빌드노트
데이터베이스 카테고리의 글입니다.
총 48개의 글
두 행의 UNIQUE 값을 순서대로 맞바꿀 때는 최종 중복이 없어도 첫 UPDATE가 실패한다. 실제 제약의 지연 가능 여부를 조회하고 해당 제약만 DEFERRED로 바꾸는 교환문을 설명한다. PostgreSQL 18.6에서 교환 성공과 COMMIT·IMMEDIATE의 중복 거절을 확인했다.
PostgreSQL의 ON DELETE SET NULL은 자식 열의 NOT NULL을 무시하지 않는다. 23502 오류와 실제 제약 조회로 충돌을 확인하고, 부모 삭제 실패·nullable 참조의 잔존 행을 비교해 관계에 맞는 삭제 정책을 고른다.
PostgreSQL 18.6의 두 연결에서 일반 조회·NOWAIT·SKIP LOCKED를 비교했다. 잠긴 후보를 건너뛴 0건과 필터 불일치의 0건을 구별하고, 빈 응답으로 전체 큐 소진을 판단할 수 없는 이유를 설명한다.
부분 UNIQUE 인덱스가 있어도 ON CONFLICT(key)가 42P10으로 실패할 수 있다. 실제 인덱스 조건을 조회해 충돌 대상에 맞추고, DO UPDATE WHERE와 비활성 입력·전체 UNIQUE 공존 시의 동작을 구분한다.
같은 날짜의 행에 같은 누적 합계가 붙는 이유는 기본 RANGE 프레임이 동률 행까지 포함하기 때문이다. PostgreSQL 18.6에서 입력 순서를 뒤집어 비교하고, ROWS의 행 범위와 고유 보조 키가 각각 해결하는 문제를 구분한다.
EXPLAIN과 EXPLAIN ANALYZE에 같은 UPDATE를 넣어 값과 RETURNING 출력을 비교했다. 실행 전에 연 트랜잭션의 롤백과 자동 커밋 뒤 롤백의 차이를 확인하고, 시퀀스·트리거·외부 효과의 검증 한계를 구분한다.
ON CONFLICT DO UPDATE가 묶음 입력에서 21000으로 실패할 때는 대상 테이블보다 입력의 충돌 키 중복을 확인한다. PostgreSQL 18.6에서 빈 테이블·기존 행의 실패 후 상태와 버전·순번으로 한 행을 선택한 결과를 비교하고, 최신 스냅샷을 고르는 기준을 설명한다.
UPDATE FROM이 성공해도 같은 대상에 붙은 여러 source 행 중 어느 값을 쓸지는 입력 순서로 보장할 수 없다. 대상 키별 조인 개수를 확인하고, 수량 상세를 합계 한 행으로 만드는 수정과 스칼라 하위쿼리의 오류·미매칭 차이를 설명한다.
PostgreSQL에서 count(col)이 0이어도 행은 있을 수 있다. NULL 두 행, 값·NULL·빈 문자열이 섞인 다섯 행, 빈 입력을 실제 비교해 count(*), count(col), count(DISTINCT col) 중 목록에 필요한 개수를 고른다.
PostgreSQL의 UPDATE 건수는 같은 값이나 NULL을 다시 대입한 행도 포함한다. 실제 RETURNING 결과와 명령 태그를 비교하고, NULL을 포함한 값 차이에 IS DISTINCT FROM을 적용하는 방법과 0건의 해석을 설명한다.
SUM의 NULL이 입력 행 부재인지, 전부 NULL인 값 때문인지 두 COUNT로 구별한다. PostgreSQL 18.6에서 집계 안팎의 COALESCE와 GROUP BY 결과 행 수를 비교하고, 합계 표시를 0으로 바꿀 때의 판단을 설명한다.
timestamptz를 바로 date로 바꾸면 연결의 TimeZone에 따라 날짜별 주문 수가 달라진다. 임시 PostgreSQL 18.6에서 자정 경계의 네 주문을 비교하고, UTC 통계와 서울 사용자 달력 중 기준을 정해 날짜 추출 전에 AT TIME ZONE을 적용하는 방법을 설명한다.