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

54.5. 토토 핫 고유성 점검

postgresqlSQL 시행 사용 고유성 제약 조건고유 토토 핫, 여러 항목을 허용하지 않는 색인입니다 동일한 키. 이 기능 세트를 지원하는 액세스 방법PG_AM.amcanuniquetrue. (현재, B- 트리 만 지원합니다.)

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

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

  • 충돌 행이 그 대신에 커미션 된 경우 삽입 된 경우 거래, 삽입자가 트랜잭션이 필요합니다. 그것이 롤백되면 갈등이 없습니다. 만약에 충돌 행을 다시 삭제하지 않고도 독창성 위반. (실제로 우리는 다른 사람을 기다립니다 끝으로의 트랜잭션을 시작한 다음 가시성 검사를 다시 실행하십시오.)

  • 마찬가지로, 유효한 행이 삭제 된 경우 커밋 된 트랜잭션으로, 삽입자가 기다려야합니다 그 거래는 커밋 또는 중단 한 다음 테스트를 반복합니다.

또한 독창성 위반을보고하기 직전에 위 규칙에 따라 액세스 방법은 행의 라이성은 삽입되고 있습니다. 그것이 죽었다면, 아니요 위반이보고되어야합니다. (이 경우에는 발생할 수 없습니다 방금 만들어진 행을 삽입하는 일반적인 시나리오 현재 거래. 발생할 수 있습니다동시에 고유 한 색인 생성, 그러나)

이 테스트 자체를 적용하려면 인덱스 액세스 방법이 필요합니다. 이는 커밋을 확인하기 위해 힙에 도달해야한다는 것을 의미합니다. 중복 키가있는 것으로 표시된 모든 행의 상태 인덱스 내용에. 이것은 의심 할 여지없이 추악합니다 비 모성이지만 중복 작업을 저장합니다. 그런 다음 절충 행에 대한 인덱스 검색이 새로운 삽입 장소를 찾는 동안 본질적으로 반복 행의 인덱스 항목. 더구나, 피해야 할 분명한 방법은 없습니다 충돌 점검이 없어서는 안될 인종 조건 새로운 인덱스 항목 삽입.

고유 한 제약 조건이 연기 가능하면 추가가 있습니다 복잡성 : 새로운에 대한 인덱스 항목을 삽입 할 수 있어야합니다. 행, 그러나 끝까지 독창성 폭력 오류를 연기하십시오 성명서 또는 나중에. 불필요한 반복 검색을 피하기 위해 인덱스, 인덱스 액세스 방법은 예비를 수행해야합니다. 초기 삽입 중 고유성 점검. 이것이 그것을 보여 주면 분명히 상충되는 라이브 튜플은 없습니다. 그렇지 않으면, 우리는 시간이되면 재확인이 발생하도록 예약합니다. 제약 조건을 시행하십시오. 다시 회전 할 때, 둘 다 삽입 된 튜플과 같은 키를 가진 다른 튜플은 라이브입니다. 그런 다음 오류를보고해야합니다. (이 목적을 위해"라이브"실제로 의미"토토 핫 항목의 핫 체인의 튜플은 라이브".) 이것을 구현하려면Aminsert함수가 전달 됨Checkunique매개 변수 다음 값 중 하나가 있습니다.

  • 고유 _check_no독창성 점검을해야합니다 (이것은 독특하지 않습니다. 색인).

  • 고유 한 _check_yes이것이 이것이 있음을 나타냅니다 비정상적인 고유 한 지수와 고유성 점검은 위에서 설명한대로 즉시 완료되었습니다.

  • 고유 _check_partial독특한 제약은 연기 가능합니다.PostgreSQL이 모드를 사용하여 각각을 삽입합니다 행의 토토 핫 항목. 액세스 방법은 중복 항목을 허용해야합니다 토토 핫로, 돌아와서 잠재적 인 복제를보고합니다. fromAminsert. 각 행에 대해 어떤 거짓이 반환되면, 연기 된 재확인이 예정됩니다.

    액세스 방법은 독특한 제약 조건이지만 False를보고하는 것은 오류가 아닙니다. 긍정적 인. 이것은 기다리지 않고 수표를 수행 할 수 있습니다. 마무리 할 다른 거래; 여기에보고 된 갈등은 그렇지 않습니다 오류로 취급되며 나중에 재확인 될 예정입니다. 더 이상 갈등이되지 않을 수 있습니다.

  • 고유 _check_existing이것은 연기 된 행을 잠재적 인 독창성 위반. 이것은 구현되지만 부름Aminsert, 액세스 방법 해야 하다not새 삽입 이 경우 색인 항목. 토토 핫 항목이 이미 있습니다. 오히려 액세스 방법은 다른 것이 있는지 확인해야합니다. 라이브 토토 핫 항목. 그렇다면 대상 행이 여전히 살고 있다면 보고 오류.

    A에서 권장됩니다고유 _check_existing호출, 액세스 방법 대상 행에 실제로 기존이 있는지 확인합니다. 토토 핫에 입력하고 그렇지 않은 경우 오류를보고합니다. 이것은 좋은 생각입니다 토토 핫 튜플 값이 전달 되었기 때문에Aminsert다시 계산되었습니다. 토토 핫 인 경우 정의에는 실제로 불변이 아닌 기능이 포함됩니다 색인의 잘못된 영역을 확인하고있을 수 있습니다. 그것을 확인합니다 대상 행은 우리가 스캔 중인지 확인합니다. 원본에 사용 된 것과 동일한 튜플 값에 대해 삽입.