Sql Server 의 identity 시드입니다 재설정하지 삭제한 후 레코드

나는 삽입됨 레코드전자문서의 SQL Server 에 데이터베이스 테이블. 한 테이블에 기본 키 정의 및 자동 증분식 아이디 시드입니다 "Yes" 로 설정되어 있습니다. 이 작업은 주로 SQL Azure, 각 테이블에는 정의된 기본 키 정체성을 가질 수 있기 때문이다.

그러나 저는 테이블에서 적립율은 미친 사람들을 위해 일부 레코드전자문서의 삭제하시겠습니까 아이디 시드입니다 테이블 인덱스 컬럼 (원하는거요 통해 자동으로 증분우선순위수준우선 1) 및 미친 받게 된다.

  • 어떻게 재설정하십시오 열 수 있도록 열이 나는 아이디 삭제 후 레코드전자문서의 순서에 올림차순 번호순으로 가능*

데이터베이스에서 외래 키 어디든요 아이디 열 사용되지 않는다는 것입니다.

질문에 대한 의견 (4)
해결책

'DBCC 크레키덴트' 이 명령을 사용할 아이디 관리 재설정하려면 카운터입니다. 명령 구문은 다음과 같습니다.

DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])
[ WITH NO_INFOMSGS ]

예:

DBCC CHECKIDENT ('[TestTable]', RESEED, 0);
GO

이 것은 이제 더 이상 지원되지 않지만, 이전 버전의 Azure SQL 데이터베이스를 사용할 수 있습니다.

Sql Server 버전에 걸쳐 다양한 new_reseed_value 유념하십시오 '' 인수는 따르면 문서용으로:

&gt. 만약 다음 행은 테이블에서 행을 networkr. 삽입됨 new_reseed_value 함께 값입니다. Sql Server 2008년 R2 버전, 이에 앞서 다음 행을 삽입됨 /dev/raw/raw1 new_reseed_value + 현재 증분값을.

그러나 나는 이 정보를 확인할 수 있다 (실제로 그냥 일반 잘못된) 오해의 소지가 있음을 관찰할 수 있기 때문에 최소한 SQL Server 2012년 여전히 /dev/raw/raw1 new_reseed_value + 현재 증분값을 없다. 마이크로소프트 (ms) 의 예를 찾을 수 있다 'c' 는 자체 평소의 동일한 페이지:

&gt. 현재 id 값을 강요하는 새로운 가치를 c. &gt. &gt. 다음 예제에서는 docname 현재 id 의 값 &gt. 아다레스티페 표를 아다레스티페이드 열에서 값을 10. &gt. 때문에 기존 11 행, 행 삽입됨 사용할 다음 표에 &gt. 즉, 새로운 값으로 현재 증분값을 대해 정의된 &gt. 열 값 플러스 (+) 1.

USE AdventureWorks2012;  
GO  
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);  
GO

그러나 이 모든 새로운 SQL Server 버전에 대한 다양한 옵션을 찻입 있다. 확인할 수 있는 유일한 방법인 것 같아요,) 는 마이크로소프트 (ms) 의 자체 테스트를 할 때까지 선택해제합니다 셨으며 클린업합니다 붽뎄 전에 실제 사용.

해설 (13)
DBCC CHECKIDENT ('TestTable', RESEED, 0)
GO

여기서 0 의 값을 'id' 시작

해설 (3)

이 점에 주의해야 합니다 만약 all 데이터는 제거될 테이블에서 통해 '삭제' (즉, no '어디서' 항), 그리고 as long as a) 의 권한에서 정보기술 (it), b) 를 참조하는 fk 없는 표 (여기 있을 때 나타나는 경우) 을 보다 효율적인 '기본' 테이블 '약간만이라도 잘라냅니다 않으므로' 'id' 시드입니다 삭제하시겠습니까 and 리셋합니다 동시에건간에. 자세한 내용은 다음 페이지를 수행됨을 MSDN 에서 장치당 잘라냅니다 표:

&gt. 테이블 기술서임을 삭제하시겠습니까 잘라냅니다 비교할 때, 다음과 같은 이점이 있습니다. &gt. &gt. 적은 트랜잭션 로그 공간 사용됩니다. &gt. &gt. 한 번에 하나씩 삭제 기술서임을 절감뿐만 행뿐만 트랜잭션 로그 기록 각 항목을 삭제할 행. 데이터를 저장하는 데 사용되는 데이터 페이지 테이블 절감뿐만 잘라냅니다 의해 할당 취소 만 페이지 테이블 데이터 및 레코드전자문서의 할당 트랜잭션 로그. &gt. &gt. 잠급니다 주로 사용하는 수가 있다. &gt. &gt. 각 행은 테이블에서 행을 사용하여 실행할 때 문이 삭제하시겠습니까 잠급니다 잠겼음을 삭제용으로. 항상 잘라냅니다 표 (잠급니다 스키마 (sch m) 등) 및 페이지 테이블 잠급니다 각 행의 수는 없습니다. &gt. &gt. * 예외 없이 제로 페이지 테이블의 남아 있다. &gt. &gt. 문이 실행된 후, 빈 페이지 테이블 삭제하시겠습니까 계속 포함되어 있습니다. 예를 들어, 빈 페이지가 없이 해제할 수 없는 최소 힙 (heap) 에서 단독 (LCK_M_X) 테이블 푸십시오. 삭제 작업이 사용하지 않는 경우 테이블 좉툑, 테이블 (힙) 가 많이 들어 빈 페이지가. 하지만, 이러한 페이지를 떠날 수 있는 빈 페이지가 indexe 대한 삭제 작업을 통해 신속하게 지우는중 적립율은 할당 해제된 뒤에 백그라운드 프로세스. &gt. &gt. 아이디 열에 엇회전식 테이블에는 경우 해당 열에 대해 정의된 값이 재설정됩니다 시드입니다 열. 정의한 시드입니다 없는 경우, 기본값입니다 1 사용됩니다. 아이디 엇회전식 대신 삭제하시겠습니까 유지하려면 사용합니다.

그래서 다음과 같습니다.

DELETE FROM [MyTable];
DBCC CHECKIDENT ('[MyTable]', RESEED, 0);

그냥 됩니다.

TRUNCATE TABLE [MyTable];

자세한 내용은 '표' 잘라냅니다 붽뎄 (링크됨 위) 에 대한 자세한 정보는 제한, etc.

해설 (6)

비록 한 번 시드 제안하고 있지만, 가장 많은 대답이 0 으로 그냥 우리가 할 수 있는 시드 다음 Id

declare @max int
select @max=max([Id])from [TestTable]
if @max IS NULL   //check when max is returned as null
  SET @max = 0
DBCC CHECKIDENT ('[TestTable]', RESEED,@max)

이렇게 하면 확인란 테이블 및 재설정됨 다음 ID.

해설 (2)

답변 및 it 재설정하십시오 샤 '찾았다' @anil 방침이었다. 그러나 이 때는 새로운 행일 삽입된 'id = 2' 다. 그래서 내가 대신 변경일 구문을 다음과 같이 사용된다.

DELETE FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED, 0)
GO

첫 번째 행에서 다음 아이디 = 1 받게 된다.

해설 (1)

비록 대부분의 '시드' 를 제안하고 그 대답이 '0', 그리고 이를 위해 일부 지켜보리니 결함 '이' ID '잘린' 테이블뿐 마이크로소프트 (ms) 가 있는 솔루션을 제외시킵니다

DBCC CHECKIDENT ('[TestTable]', RESEED)

이렇게 하면 확인란 테이블 및 재설정됨 다음 'ID'. 현재 MS SQL 2005년 이후 이 사용할 수 있었습니다.

https://msdn.microsoft.com/en-us/library/ms176057.aspx

해설 (5)

2 명령을 내리는 것이 수행할 수 있습니다

DBCC CHECKIDENT ('[TestTable]', RESEED,0)
DBCC CHECKIDENT ('[TestTable]', RESEED)

아이디 '제로' 로 첫 번째 재설정하십시오 사용 가능한 다음 값을 정할 수 있으며 향후 it

  • 제이콥
해설 (1)

@jacob

DBCC CHECKIDENT ('[TestTable]', RESEED,0)
DBCC CHECKIDENT ('[TestTable]', RESEED)

첫 번째 테이블에서 모든 항목을 선택해제합니다 협력했습니다 가져다줄래요, 그냥 한 점 한 후 위 추가했어야 관심용 트리거할 삭제입니다. 이제 볼 때마다 나는 거기서 항목인지 삭제

해설 (1)

아이디 함께 열 재설정하지 새로운 id 를 사용합니다.

DECLARE @MAX INT
SELECT @MAX=ISNULL(MAX(Id),0) FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED,@MAX)
해설 (0)

때문에 잘라냅니다 '표' 를 기록, 디스크 공간 및 재확보합니다 엇회전식 리셋합니다 비워집니다 선호하고 있다.

'삭제' 와 '크레키덴트' 용도로만 사용해야 합니다 여기서 외래 키 잘라내는 못하도록 합니다.

해설 (0)

이것은 공통 질문과 대답은 항상 같은: # 39 don&, t do it. 또한, 임의의 값을 id 로 같은 대우를 받아야 correct&quot &quot 없다;; 주문.

해설 (7)

재설정하려면 실행하십시오 스크립트입니다 id 열. 두 가지 변경 사항이 만들어야 합니다. 테이블 업데이트하려면 복귀시킴 타바레스리스 있는모든 함께 합니다. 또한 임시 테이블 이름, 아이디 열 요구사항뿐 떨어졌다. 이는 즉시 테이블을 함께 35,000 행뿐만 &amp. 3 열. 물론 이 시도하시겠습니까 백업하십시오 테이블 및 첫 테스트 환경에서.

select * 
into #temp
From tableXYZ

set identity_insert tableXYZ ON

truncate table tableXYZ

alter table #temp drop column (nameOfIdentityColumn)

set identity_insert tableXYZ OFF

insert into tableXYZ
select * from #temp
해설 (1)

이 저장 프로시저:

IF (object_id('[dbo].[pResetIdentityField]') IS NULL)
  BEGIN
    EXEC('CREATE PROCEDURE [dbo].[pResetIdentityField] AS SELECT 1 FROM DUMMY');
  END
GO

SET  ANSI_NULLS ON
GO
SET  QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[pResetIdentityField]
  @pSchemaName NVARCHAR(1000)
, @pTableName NVARCHAR(1000) AS
DECLARE @max   INT;
DECLARE @fullTableName   NVARCHAR(2000) = @pSchemaName + '.' + @pTableName;

DECLARE @identityColumn   NVARCHAR(1000);

SELECT @identityColumn = c.[name]
FROM sys.tables t
     INNER JOIN sys.schemas s ON t.[schema_id] = s.[schema_id]
     INNER JOIN sys.columns c ON c.[object_id] = t.[object_id]
WHERE     c.is_identity = 1
      AND t.name = @pTableName
      AND s.[name] = @pSchemaName

IF @identityColumn IS NULL
  BEGIN
    RAISERROR(
      'One of the following is true: 1. the table you specified doesn''t have an identity field, 2. you specified an invalid schema, 3. you specified an invalid table'
    , 16
    , 1);
    RETURN;
  END;

DECLARE @sqlString   NVARCHAR(MAX) = N'SELECT @maxOut = max(' + @identityColumn + ') FROM ' + @fullTableName;

EXECUTE sp_executesql @stmt = @sqlString, @params = N'@maxOut int OUTPUT', @maxOut = @max OUTPUT

IF @max IS NULL
  SET @max = 0

print(@max)

DBCC CHECKIDENT (@fullTableName, RESEED, @max)
go

--exec pResetIdentityField 'dbo', 'Table'

그냥 하는걸로 my answer. Sql server 2008년 r2 에 걸쳐 왔는지 이상한 고려해야 할 수 있다.

drop table test01

create table test01 (Id int identity(1,1), descr nvarchar(10))

execute pResetIdentityField 'dbo', 'test01'

insert into test01 (descr) values('Item 1')

select * from test01

delete from test01

execute pResetIdentityField 'dbo', 'test01'

insert into test01 (descr) values('Item 1')

select * from test01

첫 번째 선택, 품목 1 이면 '0'.

두 번째, 품목 1 이면 '1'. 다음 표는 재설정하지 실행하십시오 직후 창조하 값이 0 인 경우. I am not 놀란 장난하는거아니고, Microsoft 그러겄지 afaq afnor 그런거 없습니다. 우리 사회의 때문에 나는 가끔 내가 표 참조 테이블 스크립트 파일에 있는 채우는 실행하십시오 재작성할 때 이미 생성된 후, 때로는 테이블은.

해설 (0)
DBCC CHECKIDENT (, reseed, 0)

현재 id 값을 0 으로 설정합니다.

다음 id 값을 1 로 증분됩니다 확보하십시오 삽입을 대한 가치.

해설 (0)

시드 0 으로 매우 현실적이며 있지 않는 한 테이블에 클린업하기 전체적으로.

앤서니 레이먼드 완벽하겠어요 다른 현명한 답을 주어진다. 먼저 이 아이디 열 맥스야 내려받습니다 시드입니다 최대.

해설 (0)

전체 삭제, 내가 이 아이디 카운트입니다 행과 재설정하십시오 (SQL Server 2008년 R2)

USE mydb

-- ##################################################################################################################
-- DANGEROUS!!!! USE WITH CARE
-- ##################################################################################################################

DECLARE
  db_cursor CURSOR FOR
    SELECT TABLE_NAME
      FROM INFORMATION_SCHEMA.TABLES
     WHERE TABLE_TYPE = 'BASE TABLE'
       AND TABLE_CATALOG = 'mydb'

DECLARE @tblname VARCHAR(50)
SET @tblname = ''

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @tblname

WHILE @@FETCH_STATUS = 0
BEGIN
  IF CHARINDEX('mycommonwordforalltablesIwanttodothisto', @tblname) > 0
    BEGIN
      EXEC('DELETE FROM ' + @tblname)
      DBCC CHECKIDENT (@tblname, RESEED, 0)
    END

  FETCH NEXT FROM db_cursor INTO @tblname
END

CLOSE db_cursor
DEALLOCATE db_cursor
GO
해설 (0)

난 다음 스크립트를 사용하여 이 작업을 수행할 수 있습니다. # 39 의 there& 생성하는 것 하나만 있는 경우, 이는 책정안 &quot error&quot, 모두 삭제한 테이블에서 행을 IDENT_CURRENT '및' 는 현재 1 로 시작하는 테이블의 행, 즉 하나만 있었다.

DECLARE @maxID int = (SELECT MAX(ID) FROM dbo.Tbl)
;

IF @maxID IS NULL
    IF (SELECT IDENT_CURRENT('dbo.Tbl')) > 1
        DBCC CHECKIDENT ('dbo.Tbl', RESEED, 0)
    ELSE
        DBCC CHECKIDENT ('dbo.Tbl', RESEED, 1)
    ;
ELSE
    DBCC CHECKIDENT ('dbo.Tbl', RESEED, @maxID)
;
해설 (0)

그 때 기록을 모두 삭제하는 대신 사용할 수 있기 때문에 언제나 더 잘라냅니다 # 39, t doesn& 로그 공간을 사용할 수 있다.

해야 할 경우, 항상 기억하고 시드입니다 재설정하려면 삭제하시겠습니까 table) 가 사용한 경우 절대 채워지며 'DBCC 크레키덴트 (& # 39, tablenem& # 39, 시드, 0)' 첫 번째 녹음 후 받을 것이라고 id = 0 msdn 문서용으로 에서 언급된 바와 같이

&gt. T , 와 # 39 에 케이스에만 재구축합니다 인덱스화할 don& 잃을 걱정 &gt. 이 일련의 id '는 일반적인 경우에.

해설 (4)

첫 번째: 아이디 사양명세 그냥. &quot No"; &gt >; 데이터베이스 저장 autoexec. 프로젝트

그리고 나서. 아이디 사양명세 그냥. &quot YES"; &gt >; 데이터베이스 저장 autoexec. 프로젝트

데이터베이스의 ID, PK, &gt &gt 1 부터 시작합니다.

해설 (0)