2010-03-22 3 views
0

클러스터 된 새 데이터베이스가 있고 기존 데이터베이스의 테이블로 데이터를 이동했습니다. 데이터를 가져올 때 모든 것이 제대로 작동하지만 수동으로 레코드를 삽입하면 ID 열이 다음 ID 번호를 따르지 않습니다. 예를 들어, 테이블에 100 개의 레코드를 가져오고 Identity 열에 1-100이 표시되지만 데이터베이스에 행을 수동으로 추가하면 101이 아닌 102 또는 103이됩니다.SQL ID 열이 2 또는 3 씩 증가합니다.

아이디어가 없습니다. 왜 이런 일이 일어 났습니까?

그것은 내 모든 테이블에 걸쳐 일어나고 그것은 매우 실망 점점 때로는 정체성 사이의 간격은 최대 4 또는 5

답변

1

만약 트랜잭션과 롤백 내에서 "테스트"를 삽입합니다. 그런 다음 당신은 그것을 진짜로 실행합니다. 트랜잭션 내의 삽입은 롤백 한 경우에도 ID 필드를 하나씩 증가시킵니다.

+0

정보를 제공해 주셔서 감사합니다. 그러나 데이터를 가져 오는 동안 데이터베이스가 현재 "오프라인"상태이므로 트랜잭션 내에서 실행되지 않습니다. 새 테이블을 만들 수 있고 ID 열의 값이 1 일 때마다 ID 열의 숫자가 달라집니다. –

2

특정 패턴 다음에 ID 열에 의존해서는 안됩니다 (예 : 항상 1 씩 증가). 유일한 보장은 현재 테이블에있는 값이 고유하다는 것입니다.

2

IMO, 신원 열의 틈에주의해서는 안됩니다. 그러한 대리 키의 핵심은 (자연 키와는 달리) 어떤 종류의 "정확성"에 대해 걱정할 필요가 없다는 것입니다.

이제 Robin이 말한 것처럼, 롤백 중이거나 오류가 발생하여 ID가 ​​갭을 발생시킬 수 있습니다.

갭을 유발할 수있는 또 다른 요소는 ID 자체의 정의입니다. 이 문을 실행하고 증가가 SQL 서버에 의해 관리 및 거래에 걸쳐 보존되어 있기 때문에, 당신은 식별 컬럼에 의존 할 수

Declare @MyTable table (MyColumn1 Int Identity (1, 5)) 

INSERT INTO @MyTable Default Values 
INSERT INTO @MyTable Default Values 
INSERT INTO @MyTable Default Values 
INSERT INTO @MyTable Default Values 
INSERT INTO @MyTable Default Values 
INSERT INTO @MyTable Default Values 

SELECT * FROM @MyTable 
0

항상 순차적으로 무엇을 의미하는지 참조하십시오. 이 증분은 테이블 구조를 변경할 때 또는 SET IDENTITY_INSERT를 ON으로 전환하고 OFF로 되돌릴 때 재설정되지만, 필자는이를 권고하지 않습니다.

순차적 ID에 실제로 의존하는 경우 비 식별 열을 만들고 순차적으로 유지되도록 자신의 논리를 작성해야합니다.

0

SSMS를 통해 행을 추가 할 때 행을 삽입하려고 시도하고 모든 유형의 제약 조건 위반 (예 : 데이터 유형 위반 또는 외래 키 위반)이 발생하면 행이 성공적으로 삽입되지 않은 경우에도 ID가 1 씩 증가합니다 테이블에. 이것은 무슨 일이 일어 났을까요?

+1

불행히도 SSIS를 사용하지 않습니다. –

관련 문제