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

52.5. 인덱스 고유성 점검

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

10605_11011

  • 현재에 의해 충돌하는 유효한 행이 삭제 된 경우 거래, 괜찮습니다. (특히 업데이트 이후 새로운 삽입 전에 항상 이전 행 버전을 삭제합니다. 버전, 이것은 변경하지 않고 행에 업데이트 할 수 있습니다. 열쇠.)

  • 충돌 행을 삽입 한 경우 커뮤니케이션이 제대로 삽입되어야합니다 그 거래가 유발되는지 기다리십시오. 그것이 롤백된다면 그러면 갈등이 없습니다. 삭제하지 않고 커밋되는 경우 다시 충돌하면 독창성 위반이 있습니다. (안에 우리는 다른 거래가 끝날 때까지 기다리고 그런 다음 가시성 검사를 다시 실행하십시오.)

  • 마찬가지로, 충돌하는 유효한 행이 삭제 된 경우 그 대신 커미셔닝 된 트랜잭션 인 삽입자는 삽입해야합니다 그 거래가 커밋하거나 중단 될 때까지 기다린 다음 반복합니다. 테스트.

또한 독창성을보고하기 직전에 위의 규칙에 따라 액세스 방법은 삽입되는 행의 활기를 다시 확인하십시오. 그렇다면 저지른 죽은 다음 위반은보고되어야합니다. (이 경우 행을 삽입하는 일반적인 시나리오에서는 발생할 수 없습니다. 그것은 현재 거래에 의해 만들어졌습니다. 할 수 있습니다 동안 발생합니다고유 한 색인 생성 동시에, 그러나)

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

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

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

  • 고유 한 _check_yes이것은 불가능한 고유 한 지수이며 독창성입니다 위에서 설명한대로 즉시 확인해야합니다.

  • 고유 한 _check_partial독특한 제약이 연기 가능하다.토토 핫이 모드를 사용하여 삽입합니다 각 행의 인덱스 항목. 액세스 방법은 허용해야합니다 항목을 인덱스에 복제하고 잠재력을보고합니다 에서 false를 반환하여 복제물Aminsert. 거짓이있는 각 행에 대해 반품, 연기 된 재확인이 예정됩니다.

    액세스 방법은 가능한 행을 식별해야합니다 고유 한 제약을 위반하지만 오류가 아닙니다. 잘못된 긍정을보고합니다. 이를 통해 수표를 수행 할 수 있습니다 다른 거래가 완료되기를 기다리지 않고; 갈등 여기에보고 된 것은 오류로 취급되지 않으며 다시 확인됩니다. 나중에는 더 이상 갈등이되지 않을 수 있습니다.

  • 고유 _check_existing이것은 잠재적 인 독창성 위반. 비록 이것이입니다 전화로 구현Aminsert, 액세스 방법은not새 삽입 이 경우 색인 항목. 인덱스 항목이 이미 있습니다. 오히려 액세스 방법은 또 다른 라이브 인덱스 항목. 그렇다면 대상 행이 있다면 또한 여전히 살고 있습니다.보고 오류.

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