이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 62.5. 토토 꽁 머니 고유성 점검버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

54.5. 토토 핫 고유성 검사

PostgreSQLSQL 시행 다음을 사용하는 고유성 제약 조건고유 토토 핫는 다음과 같은 여러 항목을 허용하지 않는 색인입니다. 동일한 키. 이 기능 세트를 지원하는 액세스 방법pg_am.amcanunique사실입니다. (현재는 b-tree만 지원합니다.)

MVCC로 인해 항상 중복을 허용해야 합니다. 인덱스에 물리적으로 존재하는 항목: 항목은 다음을 참조할 수 있습니다. 단일 논리적 행의 연속 버전. 우리가 하는 행동 실제로 시행하고 싶은 점은 MVCC 스냅샷에 두 개가 포함될 수 없다는 것입니다. 동일한 인덱스 키를 가진 행. 이는 다음과 같이 분류됩니다. 고유한 행에 새 행을 삽입할 때 확인해야 하는 경우 색인:

  • 충돌하는 유효한 행이 현재에 의해 삭제된 경우 거래, 괜찮아요. (특히 UPDATE는 항상 새 버전을 삽입하기 전에 이전 행 버전을 삭제합니다. 키를 변경하지 않고 행에 대한 업데이트를 허용합니다.)

  • 충돌하는 행이 아직 커밋되지 않은 사용자에 의해 삽입된 경우 트랜잭션이 발생하면 삽입할 사람은 해당 트랜잭션이 있는지 확인하기 위해 기다려야 합니다. 트랜잭션 커밋. 롤백되면 충돌이 발생하지 않습니다. 만약에 충돌하는 행을 다시 삭제하지 않고 커밋합니다. 고유성 위반. (실제로 우리는 다른 사람이 오기를 기다립니다. 트랜잭션을 종료한 다음 가시성 확인을 다시 실행하세요.)

  • 마찬가지로, 충돌하는 유효한 행이 다음에 의해 삭제된 경우 아직 커밋되지 않은 트랜잭션인 경우 삽입자는 다음을 기다려야 합니다. 해당 트랜잭션을 커밋하거나 중단한 다음 테스트를 반복합니다.

또한 고유성 위반을 신고하기 직전 위의 규칙에 따라 액세스 방법은 다음을 다시 확인해야 합니다. 삽입되는 행의 활성 상태입니다. 그것이 죽은 것으로 커밋되면 아니오 위반 사항을 신고해야 합니다. (이런 경우는 해당 기간 동안에는 발생할 수 없습니다. 방금 생성된 행을 삽입하는 일반적인 시나리오 현재 거래. 다음 중에 발생할 수 있습니다.동시에 고유 토토 핫 생성하지만.)

이 테스트 자체를 적용하려면 색인 액세스 방법이 필요합니다. 이는 커밋을 확인하려면 힙에 도달해야 함을 의미합니다. 중복 키가 있는 것으로 표시된 행의 상태 인덱스 내용에. 이것은 의심할 여지없이 추악하고 모듈화되지 않았지만 중복된 작업을 줄여줍니다. 조사하면 충돌하는 행에 대한 인덱스 조회는 다음과 같습니다. 새 항목을 삽입할 위치를 찾는 동안 본질적으로 반복됩니다. 행의 인덱스 항목. 게다가 피할 수 있는 확실한 방법도 없습니다. 충돌 검사가 필수적인 부분이 아닌 한 경쟁 조건 새 색인 항목을 삽입합니다.

고유 제약 조건이 연기 가능한 경우 추가 복잡성: 새로운 항목에 대한 색인 항목을 삽입할 수 있어야 합니다. 행이 끝날 때까지 고유성 위반 오류를 연기합니다. 성명 또는 그 이후. 불필요한 반복 검색을 피하기 위해 인덱스, 인덱스 액세스 방법은 예비 작업을 수행해야 합니다 초기 삽입 중 고유성 검사. 이것이 그것을 보여준다면 확실히 충돌하는 라이브 튜플이 없습니다. 끝났습니다. 그렇지 않은 경우에는 재확인이 필요할 때 다시 확인하도록 예약합니다. 제약조건을 시행합니다. 재검사 당시 두 가지 모두에 해당하는 경우 삽입된 튜플과 동일한 키를 가진 다른 튜플이 활성화되어 있습니다. 그런 다음 오류를 보고해야 합니다. (이 목적을 위해 참고하세요."실시간"실제로는 의미합니다"색인 항목의 HOT 체인에 있는 모든 튜플은 활성 상태입니다.".) 이를 구현하려면,아민서트함수가 전달되었습니다.checkUnique매개변수 다음 값 중 하나를 가짐:

  • UNIQUE_CHECK_NO아니요를 나타냅니다. 고유성 검사를 수행해야 합니다(이것은 고유한 것이 아닙니다). 색인).

  • UNIQUE_CHECK_YES이것은 다음을 나타냅니다. 지연할 수 없는 고유 인덱스가 있어야 하며 고유성 검사는 다음과 같아야 합니다. 위에서 설명한 대로 즉시 완료됩니다.

  • UNIQUE_CHECK_PARTIAL다음을 나타냅니다. 고유 제약 조건은 연기 가능합니다.PostgreSQL이 모드를 사용하여 각 항목을 삽입합니다. 행의 토토 핫 항목. 액세스 방법은 중복 항목을 허용해야 합니다. 토토 핫에 추가하고 반환하여 잠재적인 중복을 보고합니다. 거짓:아민서트. 각 행에 대해 FALSE가 반환되면 연기된 재검사가 예약됩니다.

    액세스 방법은 다음을 위반할 수 있는 모든 행을 식별해야 합니다. 고유 제약조건이 있지만 false로 보고하는 것은 오류가 아닙니다. 긍정적인 점. 이렇게 하면 기다리지 않고 검사를 완료할 수 있습니다. 완료해야 할 다른 거래; 여기에 보고된 충돌은 오류로 처리되어 나중에 다시 확인됩니다. 더 이상 충돌이 발생하지 않을 수 있습니다.

  • UNIQUE_CHECK_EXISTING다음을 나타냅니다. 이는 다음으로 보고된 행에 대한 지연된 재검사입니다. 잠재적인 고유성 위반. 이것이 구현되었지만 전화아민서트, 액세스 방법 필수아님새 항목 삽입 이 경우 토토 핫 항목입니다. 색인 항목이 이미 존재합니다. 오히려 액세스 방법에서 다른 방법이 있는지 확인해야 합니다. 라이브 토토 핫 항목. 그렇다면 대상 행도 여전히 활성 상태인 경우 오류를 신고하세요.

    다음을 권장합니다.UNIQUE_CHECK_EXISTING호출, 액세스 방법 대상 행에 실제로 기존 행이 있는지 추가로 확인하세요. 색인에 항목을 추가하고 그렇지 않은 경우 오류를 보고합니다. 좋은 생각이에요 토토 핫 튜플 값이 전달되었기 때문입니다.아민서트재계산되었을 것입니다. 지수라면 정의에는 실제로 불변이 아닌 함수가 포함됩니다. 토토 핫의 잘못된 영역을 확인하고 있을 수 있습니다. 확인하는 것은 재검사에서 대상 행이 발견되어 스캔 중인지 확인합니다. 원본에 사용된 것과 동일한 튜플 값에 대해 삽입.