PostgreSQL NOT VALID 외래키인데 새 INSERT는 거절된다
NOT VALID 외래키는 기존 행의 검증을 미루지만 새 위반 INSERT를 허용하지 않는다. PostgreSQL 18.6에서 새 쓰기 거절, 기존 위반 정리 전후 VALIDATE와 convalidated의 변화를 비교해 데이터 정리와 검증 완료를 구분한다.
빌드노트
데이터베이스 카테고리의 글입니다.
총 48개의 글
NOT VALID 외래키는 기존 행의 검증을 미루지만 새 위반 INSERT를 허용하지 않는다. PostgreSQL 18.6에서 새 쓰기 거절, 기존 위반 정리 전후 VALIDATE와 convalidated의 변화를 비교해 데이터 정리와 검증 완료를 구분한다.
ON CONFLICT DO NOTHING은 중복 행을 건너뛰므로 RETURNING id도 0행이 된다. PostgreSQL 18.6에서 첫 삽입·중복·별도 SELECT와 같은 값 UPDATE의 트리거 실행을 비교하고, 기존 ID 조회 경로와 동시성 미검증 범위를 설명한다.
JSONB의 ->는 JSON 값을, ->>는 SQL text를 반환한다. PostgreSQL 18.6의 합성 입력으로 문자열·숫자·JSON null·없는 키·SQL NULL의 결과를 비교하고, 따옴표 처리와 타입 확인, 숫자 캐스팅의 판단 기준을 설명한다.
오래 열린 트랜잭션에서 now()가 반복되는 이유를 짧은 SQL로 확인한다. 트랜잭션 시작, SQL 시작, 호출 순간 중 기록할 의미에 따라 now(), statement_timestamp(), clock_timestamp()를 고르는 기준을 설명한다.
NOT IN 하위 조회에 NULL이 섞이면 제외 목록에 없는 행도 결과에서 사라진다. 임시 PostgreSQL 18.6의 실제 출력으로 NULL 필터와 상관 NOT EXISTS를 비교하고, 조회 대상의 NULL을 남길지 같은 값으로 제외할지 고르는 방법을 설명한다.
명시적 ID를 넣은 이관은 시퀀스를 전진시키지 않을 수 있다. PostgreSQL 18.6에서 자동 INSERT 충돌, setval의 true·false와 빈 테이블, 롤백 후 남는 번호를 비교하고 실제 생성 경로와 쓰기 중단 조건을 확인한다.
DISTINCT ON은 그룹마다 첫 행을 남기므로 최신 시각과 동률 ID 규칙을 ORDER BY에 적어야 한다. PostgreSQL 18.6에서 시각·ID 정렬 방향, 잘못된 선두 정렬의 42P10 오류, 대표행 선택 뒤 표시 순서를 실제 비교했다.
PostgreSQL의 DESC는 기본적으로 NULL을 앞에 둔다. 네 개의 합성 행으로 ASC·DESC·NULLS LAST와 LIMIT 1을 비교하고, 동률 보조 키와 날짜 없는 행을 제외할 조건을 정한다.
LIKE INCLUDING DEFAULTS로 serial 열을 복사하면 nextval 기본값이 원본 시퀀스를 계속 가리킨다. PostgreSQL 18.6에서 기본값·카탈로그·교차 INSERT를 비교하고, 복사본에 새 시퀀스를 연결하는 방법과 identity 복사의 독립 생성기를 확인한다.
CREATE INDEX IF NOT EXISTS는 같은 이름이 있으면 생성을 건너뛴다. PostgreSQL 18.6에서 NOTICE·OID·정의의 불변과 새 이름의 b 인덱스를 비교하고, pg_get_indexdef와 카탈로그로 실제 정의를 확인하는 방법을 설명한다.
jsonb의 @>는 배열 원소의 순서와 중복 횟수를 구분하지 않는다. PostgreSQL 18.6에서 포함과 동등 비교를 대조하고, 양방향 포함에 길이를 더해도 값별 개수는 같지 않을 수 있음을 확인한다. 배열 전체의 일치와 개수 비교를 구별해 조건을 선택한다.
같은 AT TIME ZONE을 붙여도 timestamp와 timestamptz는 변환 방향과 결과 타입이 다르다. PostgreSQL 18.6의 UTC·서울 연결에서 타입·표시·epoch를 비교하고, 현지 시각 해석과 특정 지역 표시를 구분한다.