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

59.5. 인덱스 고유성 검사

PostgreSQL다음을 사용하여 SQL 고유성 제약 조건을 적용합니다.고유 색인, 이는 동일한 키를 가진 여러 항목을 허용하지 않는 인덱스입니다. 이 기능 세트를 지원하는 액세스 방법amcanunique사실입니다. (현재는 b-tree만 지원합니다.)

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

  • 충돌하는 유효한 행이 현재 트랜잭션에 의해 삭제되었더라도 괜찮습니다. (특히 UPDATE는 새 버전을 삽입하기 전에 항상 이전 행 버전을 삭제하므로 키 변경 없이 행에 대한 UPDATE가 허용됩니다.)

  • 충돌하는 행이 아직 커밋되지 않은 트랜잭션에 의해 삽입된 경우, 삽입자는 해당 트랜잭션이 커밋되는지 확인하기 위해 기다려야 합니다. 롤백되면 충돌이 발생하지 않습니다. 충돌하는 행을 다시 삭제하지 않고 커밋하면 고유성 위반이 발생합니다. (실제로는 다른 트랜잭션이 끝날 때까지 기다린 다음 가시성 확인을 다시 실행합니다.)

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

또한 위 규칙에 따라 고유성 위반을 보고하기 직전에 액세스 방법은 삽입되는 행의 활성 상태를 다시 확인해야 합니다. 사망한 경우 위반 사항을 보고해서는 안 됩니다. (이 경우는 현재 트랜잭션에 의해 방금 생성된 행을 삽입하는 일반적인 시나리오에서는 발생할 수 없습니다. 동안 발생할 수 있습니다.고유 인덱스를 동시에 생성그러나.)

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

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

  • UNIQUE_CHECK_NO젠 토토 검사를 수행해서는 안 됨을 나타냅니다(이것은 고유 인덱스가 아닙니다).

  • UNIQUE_CHECK_YES이것은 지연할 수 없는 고유 인덱스이며 위에서 설명한 대로 젠 토토 확인을 즉시 수행해야 함을 나타냅니다.

  • UNIQUE_CHECK_PARTIAL고유 제약 조건이 연기 가능함을 나타냅니다.포스트그레SQL이 모드를 사용하여 각 행의 색인 항목을 삽입합니다. 액세스 방법은 인덱스에 대한 중복 항목을 허용해야 하며 FALSE를 반환하여 잠재적인 중복 항목을 보고해야 합니다.아민서트. FALSE가 반환되는 각 행에 대해 지연된 재검사가 예약됩니다.

    액세스 방법은 고유 제약 조건을 위반할 수 있는 모든 행을 식별해야 하지만 거짓 긍정을 보고하는 것은 오류가 아닙니다. 이를 통해 다른 트랜잭션이 완료될 때까지 기다리지 않고 검사를 수행할 수 있습니다. 여기에 보고된 충돌은 오류로 처리되지 않으며 나중에 다시 확인될 때까지 더 이상 충돌이 아닐 수 있습니다.

  • UNIQUE_CHECK_EXISTING이것은 잠재적인 젠 토토 위반으로 보고된 행의 지연된 재검사임을 나타냅니다. 이는 호출을 통해 구현되지만아민서트, 액세스 방법은 다음과 같습니다아님이 경우 새 색인 항목을 삽입하십시오. 색인 항목이 이미 존재합니다. 오히려 액세스 방법은 다른 라이브 인덱스 항목이 있는지 확인해야 합니다. 그렇다면 대상 행도 아직 활성화되어 있으면 오류를 보고하세요.

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