2010-01-07 4 views
0

ID 기본 키에 ID를 사용하고 있습니다. 그리고 몇 가지 데이터를 삽입합니다. 예를 들면.ID SQL Server 문제

데이터 1 -> 성공적으로 오류없이 추가하십시오. ID 1

데이터 2 -> 성공적으로 오류없이 추가하십시오. ID 2

데이터 3 -> 오류로 인해 추가 오류가 발생했습니다.

데이터 4 -> 오류가 발생하면 추가 오류가 발생합니다.

데이터 5 -> 성공적으로 오류없이 추가하십시오. 당신은 그 ID를 볼 수있는 5

ID는 5

왜 2의 도약을 가지고? 어떻게 이것을 해결할 수 있습니까 ??

답변

0

이것은 의도적으로 설계된 동작이므로 SQL Server는 카운터를 증가시키고 행을 만들려고 시도합니다. 트랜잭션이 실패하면 (항상 암시 적 트랜잭션이 있음) 롤백되지만 자동 증가 값은 다시 사용되지 않습니다. 이것은 설계 상으로는 피할 수 있음을 알게되면 매우 놀랄 것입니다 (결국은 명령을 호출하고 현재 최대 값으로 재설정 할 수 있습니다). 이 값을 생성하기 위해 항상 트리거를 사용할 수는 있지만 성능에 영향을 미칩니다. 일반적으로 auto_increment의 값을 신경 쓰지 않아야합니다. 나중에

3

그게 문제 야?

일반적으로 기본 키 열에서 ID를 사용합니다. 그런 다음이 기본 키는 대리 키이며 이는 비즈니스 가치/비즈니스 의미가 전혀 없음을 의미합니다. 데이터베이스가 레코드를 고유하게 식별 할 수 있도록하기 위해 필요한 '관리'사실입니다. 그래서이 값이 무엇인지는 중요하지 않습니다. 또한 틈이 있다는 것도 중요하지 않습니다. 왜 그들이 연속적으로되기를 원하나요?

그리고 삽입이 실패 할 때 아무런 간격도 나타나지 않는다고 가정합시다. 행을 삭제할 때 어떤 것을하고 나중에 하나를 삽입할까요? 틈새를 채우시겠습니까?

+0

ID에서 갭을 볼 때 회계사가 놀란다 :) 그들은 레코드가 존재한다고 생각하지만 어떻게 든 악의적으로 삭제되었습니다. –

+0

회계사는 그 ID를 결코 보지 말아야합니다. 왜냐하면 그것은 DB에서 사용되는 것이기 때문에 비즈니스 의미가 없습니다. 그리고 회계사가 데이터베이스에 직접 액세스 할 수 있다고 말하지 마십시오. :) –

+0

트랜잭션 ID 인 경우 트랜잭션 ID입니다. 일반 사용자 인구와 달리 회계사는 자신의 물건에 대한 고유 한 숫자 ID를 매우 중요하게 생각합니다. –

0

삽입이 실패한 경우 세트의 identity_insert mytable을에두고 max (myfield) +1을 사용하여 손으로 다음 신원을 계산할 수 있습니다. 하지만 동시성 문제가있을 수 있습니다.

하지만 이것은 골칫거리입니다. 갭에는 문제가 없습니다.

0

@Frederik 대부분의 답변 - 기본 키와 비즈니스 키가 섞여 있다고 덧붙입니다. 송장 번호 (또는 무엇이든)는 송장 번호로 식별해야합니다. 송장 번호는 테이블에 UNIQUE 열을 가져야하는 비즈니스 키입니다. 기본 키는 테이블의 행을 식별하기 위해 여기에 있으며 데이터베이스에 의해 (..에 참여하기 위해) DBA 만 사용해야합니다.

비즈니스 사용자에게 기본 키를 표시하면 문제가 발생할 것이고 데이터베이스는 조만간 참조 무결성을 잃게됩니다. 언제나 사람들은 창의적입니다.