IDENTITY 값 재설정


16

IDENTITY 열이있는 테이블이 있습니다. 개발하는 동안 때때로 행을 삭제하고 다시 추가합니다. 그러나 IDENTITY 값은 항상 증가하고 다시 추가 할 때 1부터 시작하지 않았습니다. 이제 내 아이디가 68-> 92에서 벗어나고 코드가 충돌합니다.

IDENTITY 값을 어떻게 재설정합니까?


누락 된 ID 값에 대해 코드를 더 탄력적으로 만들 것입니다. 식별 컬럼은 연속 된 번호를 보장하지 않으며, 결국 일
Trubs

답변:


29

다음과 같이 ID 값을 재설정 할 수 있습니다

DBCC CHECKIDENT('tableName', RESEED, 0)

다음에 TableName에 삽입 할 때 삽입 된 ID 값은 1입니다.

테이블에서 행 을 삭제 하면 Identity 값이 재설정되지 않지만 계속 증가합니다. 당신의 사건에서 일어난 것처럼.

이제 테이블 을 자르면 Identity 값이 테이블의 원래 Seed 값으로 재설정됩니다.

자르기와 삭제차이점에 대한 자세한 예와 자세한 설명은 SQL Server – 삭제, 잘라 내기 및 다시 식별 아이디 를 참조하십시오.


22

Kin은 IDENTITY 값을 재설정하는 방법을 보여 주었지만 실제로 모든 데이터를 제거 할 때 개발 환경 외부 에서 왜 이렇게해야합니까?

프로덕션 환경에서 연속적인 IDENTITY 값 시퀀스를 유지하지 않기를 바랍니다. 그리고 IDENTITY 값을 하드 코딩하기 위해 실제로 코드를 작성하지 않기를 바랍니다. 이것이 의미있는 ID 값이면 IDENTITY 속성 사용을 중지해야합니다.

이를 방지 할 수있는 몇 가지 사항이 있습니다.

  • 트랜잭션 중에 IDENTITY 값이 할당되고 트랜잭션이 롤백되면 값이 "기회되지"않으며 다음 값은 사용되지 않은 +1입니다.
  • 행이 나중에 삭제되면 IDENTITY는 다시 간격을 메 우지 않습니다.
  • 문서화되지 않고 매우 비싼 추적 플래그를 사용하지 않는 한 SQL Server 2014 수정되지 않을 때까지 SQL Server 2012 에는 수정되지 않는 활성 버그가 있습니다. 이로 인해 다시 시작하면 IDENTITY 열에서 최대 1000 개의 값이 삭제됩니다. . Connect의 버그 는 가용성 그룹과 관련된 장애 조치 이벤트로 제한됨을 제안하지만 버그가 그보다 훨씬 광범위하다는 것을 확신 할 수 있습니다.

요컨대, 차이에 관심이 있거나 이러한 값에 특정 의미를 부여하려면 IDENTITY 사용을 중지하십시오. 테이블을 삭제하고 다시 작성하고 값을 삭제하고 다시 채워야 할 때 업데이트를 수행하거나 해당 열에 대해 하드 코드 된 값으로 삽입을 수행하십시오.

제 1 키와 아이덴티티는 같은 것이 아닙니다. 명시 적으로 정의하지 않는 한 ID 열은 기본 키가 아니며 ID 열이 아닌 기본 키를 가질 수 있습니다.


-4

ID 필드의 증분 값을 따르지 않은 마지막 행만 제거해야하는 경우 쉽고 안전한 방법이 있습니다.

  1. 먼저 '점프'한 마지막 레코드를 삭제하십시오.
  2. 아이디 필드의 데이터 유형을 변경하십시오 (int에서 bigint로 또는 그 반대로)
  3. 테이블을 저장
  4. 새 레코드를 추가하고 가장 높은 값의 수 + 1을 할당하는지 확인하십시오.
  5. 필요에 따라 식별 필드의 데이터 유형을 교체하십시오.

그리고 당신은 끝났습니다.


3
"테이블 저장"은 SQL Server에 대한 의미있는 설명이 아닙니다. 데이터 유형을 변경하는 것은 행이 100 개 미만인 사소한 것일 수 있지만 큰 테이블의 경우 매우 비쌀 수 있습니다.
Michael Green

2
SSMS를 의미한다고 가정합니다. 그러면 새 테이블이 만들어지고 모든 행을 copŷ하고 이전 테이블을 삭제하고 새 테이블의 이름을 바꿉니다. 그리고 데이터 유형을 다시 전환하려면이 작업을 두 번 수행해야합니다. 너트를 깨기 위해 망치를 사용하고 있습니다.
Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.