2017-09-18 3 views
0

이 문제는 잘 설명되어 있으며 그 이유가 설명되어 있습니다 (예 : StackOverflow threads 1, 2. 3). 실용적인 솔루션은 어떨까요? 테이블 상태가 (신규 또는 행 삭제됨)에 관계없이 항상 1에서 시작하는 행 ID가 인 테이블을 외부 사양별로 출력해야하는 스크립트가 있습니다. ID 시드를 항상 1로 시작하도록 다시 시드하십시오. - 실용적인 코드

문제

다음입니다 - 나는 실행하는 경우 :

DBCC CHECKIDENT ('TableName', RESEED, 0); 
  • 행을했다 (삭제 된) 테이블에 다음 ID는 1으로 시작됩니다. 그건 그렇고, 난 입니다 명령 후 명령을 사용하여 오전. 이것은 좋다.
  • 하지만 새로 만든 테이블에이 같은 명령을 실행하는 경우, 첫 번째 행 ID가됩니다 = 0의 IDENTITY (1,1)이 설정되어있는 경우에도 (여기에 나열된 모든 경우에).

설명했듯이이 동작은 SQL Server 사양에 따라 올바릅니다. 이를 방지하기 위해, 누군가는 실행 제안 :

DBCC CHECKIDENT ('TableName', RESEED); 

첫 번째 신원 (적어도 내 envrionment 설정이 일에) 새로 만든 테이블에 1을 수 있지만 테이블, 삭제 된 데이터를 가지고있는 그것을 삭제 마지막 시드 (예 : 123456 일 수 있음)을 보유합니다.

는 또한 시도 :

DBCC CHECKIDENT ('TableName', RESEED, 1); 

첫 ID 다음 2 것이다.

그럼 실용적인 방법은 무엇입니까 항상 첫 번째 삽입 된 행에 대해 ID가 1입니까? 첨부 된 링크에서 누군가가 더미 행을 삽입하고을 삭제 한 다음 "0"시드를 사용하고 마지막으로 행 삽입을 제안했습니다. 이것이 올바른 접근 방법입니까?

+0

이 보이는합니다. 더미 행을 삽입하고 삭제 한 다음 다시 시드하는 것이 쉬운 방법 인 것처럼 보입니다. – Magisch

+0

레코드를 삭제하는 방법에 대한 쿼리를 제공하십시오. –

+1

ID 열의 숫자 값에 신경 쓰면 아마 잘못 사용했을 것입니다.그것들을 불투명 한 얼룩으로 취급하십시오. * 숫자로 된 열에 맞추기 위해서 * 당신은 괜찮습니다. 특정 값, 순차적 할당, 간격 부족 등을 기대하면 아마도 문제가 발생할 것입니다. –

답변

1

사용 DBCC CHECKIDENT ('TableName', RESEED, 0);를 사용합니다.

작성한 후에 더미 데이터를 삽입하고 삽입 한 다음 삭제하면 DBCC CHECKIDENT ('TableName', RESEED, 0);이 항상 작동합니다.

은 또한 사전에 행을 삭제 삼가과 같은 것을 할 수 있습니다 : 당신은 다음 옵션을 알고처럼

IF NOT EXISTS (SELECT 1 FROM TableName) 
    BEGIN 
     DBCC CHECKIDENT ('TableName', RESEED, 1); 
    END 
ELSE 
    BEGIN 
     DELETE * FROM TableName; 
     DBCC CHECKIDENT ('TableName', RESEED, 0); 
    END 
GO 
0

레코드가 삭제 된 후 확인을 위해 @@ROWCOUNT을 체크 할 수 있습니다.

@@ROWCOUNT 경우보다 높은 0 당신이 그렇지 않으면 당신은 본질적으로 두 가지 옵션이 있습니다 DBCC CHECKIDENT ('TableName', RESEED, 1);

+0

@@ rowcount는 의미가 있지만, DBCC CHECKIDENT (' TableName ', RESEED, 1)은 ID = 2 인 첫 번째 행을 가져옵니다. 그렇지 않습니까? –