programing

삽입이 성공하지 못한 경우 기본 키 증가를 방지하시겠습니까?

subpage 2023. 6. 23. 22:10
반응형

삽입이 성공하지 못한 경우 기본 키 증가를 방지하시겠습니까?

다음과 같은 '위치' 표가 있습니다.

enter image description here

API를 사용하여 유효한 레코드를 보내면 테이블이 인덱스 1로 정상적으로 시작됩니다.테이블의 제약 조건(잘못된 외래 키, 빈 필드 등)으로 인해 허용되지 않는 항목을 보내면 당연히 테이블은 받지 않고 아무것도 삽입되지 않습니다.그러나 만약 내가 id2 대신 다른 유효한 레코드를 보낸다면 테이블에 레코드가 하나만 있고 삭제된 것이 없음에도 불구하고 3으로 색인화됩니다.이것을 피할 수 있는 간단한 방법이 있습니까?

감사합니다!

이 시나리오를 고려해 보십시오. 트랜잭션을 시작하고 INSERT를 수행합니다.INSERT성공했습니다. ID 2를 할당합니다.그러나 동일한 트랜잭션의 후속 쿼리는 실패하고 성공적인 INSERT를 포함하여 롤백해야 합니다.

그 사이에 다른 세션도 ID 3을 할당하는 자체 삽입을 수행합니다.해당 트랜잭션은 커밋됩니다.이제 테이블에 ID가 3인 행이 있지만 ID가 2인 행은 없습니다.

어떻게 처리하시겠습니까?

트랜잭션을 커밋할 때까지 모든 동시 삽입을 차단합니다.이는 연속된 값만 사용되도록 하기 위해 필요합니다.

사용되지 않는 ID 값의 증가하는 목록으로 자동 증분을 구현합니다.목록의 공간을 얼마나 늘려야 합니까?

사실 자동 증가는 "갭" 또는 사용되지 않는 값을 허용하는 것이 일반적입니다.INSERT가 실패하거나 트랜잭션이 롤백되거나 나중에 행을 삭제하면 연속된 ID 값 순서에 공백이 생깁니다.

이것은 효율성을 위해 필요한 타협입니다.자동 증분 값은 고유해야 하지만 연속적일 필요는 없습니다.행 번호가 아닙니다.ID 값이 연속적인지 확인해야 하는 경우 시스템의 다른 항목(예: 동시 INSERT)을 희생해야 합니다.행을 삭제한 경우 다음 행의 번호를 모두 변경하시겠습니까?

일부 사람들은 ID 값이 떨어질까 봐 ID 값을 압축하려고 합니다.기본 키가 BIGINT UNSIGNED입니다.

https://mariadb.com/kb/en/bigint/ 은 다음과 같이 말합니다.

부호 없는 범위는 0 ~ 18446744073709551615입니다.

자동 증가를 0에서 시작하여 초당 100만 번씩 증가시키면 BIGINT UNSIGNED는 584,542년 이상 지속되는 18,446,744,073,709초 동안 지속됩니다.

언급URL : https://stackoverflow.com/questions/72235247/avoid-incrementing-primary-key-if-insert-is-not-successful

반응형