2010-05-27 3 views
13

최근 PostgreSQL 데이터베이스에서 SQL Server 데이터베이스로 마이그레이션했습니다. 데이터를 전환하려면 IDENTITY_INSERT를 사용하도록 설정해야했습니다. 모든 테이블에서 삽입을 수행 할 때 ID 값이 중복되어 (기본 키로 설정 됨) 모든 종류의 이상한 오류가 발생한다는 것을 알게되었습니다.identity_insert를 사용한 후 자동으로 다시 시드하는 방법은 무엇입니까?

나는 꽤 많은 테이블을 가지고있다. max(RID) 이후에 모든 테이블의 ID를 자동으로 다시 시드하는 가장 쉬운 방법은 무엇입니까?

+0

DBCC CHECKIDENT ('tablename', RESEED)'http://stackoverflow.com/a/14445413/618186 – guanome

답변

21

this link에있는 정보를 재설정해야하는 각 테이블에서 최대 (RID)를 얻는 SQL 함수와 함께 사용하십시오. 당신은 25000에 기본 키 씨앗을 시작하려는 경우 예를 들어, 코드 아래 사용 (StartSeedValue를 - 1)

DBCC CHECKIDENT('myTable', RESEED, 24999) 

그래서 함께, 당신은이

DECLARE @maxVal INT 
SELECT @maxVal = ISNULL(max(ID),0)+1 from mytable 
DBCC CHECKIDENT('mytable', RESEED, @maxVal) 

처럼 somethink와 끝까지해야한다 나는 SQL 기능을 :) 작성한 이후 죄송 의사 코드, 오랜만

편집 : 캐치에 대한

감사합니다,

01 int로 정수를 변경
USE YourDBName 
GO 
SELECT * 
FROM sys.Tables 
GO 

이렇게하면 데이터베이스의 모든 사용자 테이블 목록이 제공됩니다. 이 쿼리를 '루프'로 사용하면 모든 테이블에서 시드를 다시 설정할 수 있습니다.

+1

모든 테이블에 대해 자동으로 이렇게 할 수있는 방법이 있습니까? – Earlz

+0

+1하지만 정수는 SQL 서버 데이터 유형이 아니므로 'DECLARE @maxVal INT'를 사용하고 변수를 채 웁니다.'SELECT @maxVal = ISNULL (max (ID), 0) +1 from mytable' –

+0

@KM ISNULL 검사에서 좋은 메모가 있지만 정수는 SQL Server 2008 – Earlz

9

토미의 대답은 정확하지만 내가 documentation을 읽고있다하면 바로이 간단하게 할 수 있습니다 단지에 :

DBCC CHECKIDENT ('myTable') 

이 문서에 따르면

테이블의 현재 ID 값이 작은 경우 최대 ID 값이 ID 열에 저장되어있는 경우 ID 열의 최대 값을 사용하여 재설정됩니다.

이렇게하면 수동으로 최대 ID를 조회하지 않아도되며 SQL Server 2005 이상에서 지원됩니다.

원본 OP 케이스에서 작동해야합니다. 문서는이 작동하지 않습니다하지만 이가지 경우를 언급, 당신은 수동으로 최대 ID 값을 찾고 토미의 솔루션에 백 가을이 있습니다

  • 현재 ID 값이 테이블의 최대 값보다 큽니다.
  • 모든 행이 테이블에서 삭제됩니다.
+0

부터 시작하여 모든 테이블에 자동으로 추가하려면 mytable 에서 @maxVal = ISNULL (max (ID), 0)을 선택하십시오. 'Exec sp_MSforeachtable'DBCC CHECKIDENT (''? '') '' – Aristos

0

아마도 가장 쉬운 방법 (같은이 소리 미친 코드 냄새 나는 보이는대로가 아니라) 바로 다음과 같이 두 번 DBCC CHECKIDENT를 실행하는 것입니다 :

-- sets all the seeds to 1 
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'', RESEED, 1)' 

-- run it again to get MSSQL to figure out the MAX/NEXT seed automatically 
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')' 

을 완료.

:

-- run it again to display what the seeds are now set to 
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')' 

이 문서에서 주석을 활용 단지 창조적 인 방법 : 당신이 원하는 경우

, 당신은 모든 씨앗으로 설정 한 것을보고 한 번 더 실행할 수 있습니다

테이블의 현재 ID 값이 식별 열에 저장된 최대 ID 값보다 작은 경우 식별 열의 최대 값 을 사용하여 재설정됩니다.

0

롤백 사례 - 난 내 데이터베이스에 테스트하고 내가 전에 이곳에 나열된 코드를 사용하는 경우에만 작동 한

(+1의 수정과 함께 - 우리가 필요하지 않습니다). 유 사용하는 경우, 다음이 11 될 것입니다 코드 뒤에 현재 열 (10), - u는 'ISNULL'부분 후 1을 넣으면

DECLARE @maxVal INT 
SELECT @maxVal = ISNULL(max(codsequencia),0) from teste_sequencial 
DBCC CHECKIDENT(teste_sequencial, RESEED, @maxVal) 

참고 다음 ID 열은 예를 들어, 한 이동합니다 +1 isnull 후 +1, +12 것입니다.

AND, 코드 :

DBCC CHECKIDENT (teste_sequencial) 

Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'')' 

가지 경우 롤백의 경우에 모두 나를 위해 작동하지 않았다. 트랜잭션을 열고 롤백을 수행하면 시드가 트랜잭션에서 사용 된 마지막 번호에서 시작됩니다.

관련 문제