복붙노트

[SQL] DBCC CHECKIDENT는 0으로 신원을 설정합니다

SQL

DBCC CHECKIDENT는 0으로 신원을 설정합니다

나는 테이블에 ID를 재설정이 코드를 사용하고 있습니다 :

DBCC CHECKIDENT('TableName', RESEED, 0)

이것은 내가 id 컬럼에 1을 삽입 할 첫 번째 인서트, 잘 대부분의 시간을 작동합니다. 제가 DB를 삭제하고 다시 작성하지만 경우 (내가 작성한 스크립트를 사용하여) 다음 DBCC CHECKIDENT, 0의 ID가됩니다 삽입 된 첫 번째 항목을 호출합니다.

어떤 아이디어?

편집 : 내가 발견 조사한 후 나는 설명서를 제대로 읽어 보지 않았 : http://msdn.microsoft.com/en-us/library/aa258817(SQL.80).aspx -. "현재 ID 값이 new_reseed_value로 설정이 생성 된 이후 행이 테이블에 삽입되지 않은 경우, DBCC CHECKIDENT는 ID로 new_reseed_value를 사용하는 실행 후 삽입 된 첫 번째 행. 그렇지 삽입 다음 행이 사용 new_reseed_value + 1 "

해결법

  1. ==============================

    1.당신이 당신의 질문에 지적이 문서화 된 동작입니다. 나는 여전히 이상한 생각 찾을 수 있습니다. 나는 테스트 데이터베이스를 다시 채울 사용하고 난 신분 필드의 값에 의존하지 않더라도 그것은 처음부터 처음으로 모든 데이터를 제거하고 다시 채우는 후 데이터베이스를 채우는 때 짜증나는 약간 다른 값을 가지고 있었다.

    당신이 당신의 질문에 지적이 문서화 된 동작입니다. 나는 여전히 이상한 생각 찾을 수 있습니다. 나는 테스트 데이터베이스를 다시 채울 사용하고 난 신분 필드의 값에 의존하지 않더라도 그것은 처음부터 처음으로 모든 데이터를 제거하고 다시 채우는 후 데이터베이스를 채우는 때 짜증나는 약간 다른 값을 가지고 있었다.

    가능한 해결책은 삭제 대신 테이블을 청소 잘라 내기를 사용하는 것입니다. 그러나 당신은 모든 제약 조건을 삭제하고 나중에 다시 작성해야

    이런 식으로 항상 새로 만든 테이블로 동작하며 DBCC CHECKIDENT를 호출 할 필요가 없습니다. 첫 번째 ID 값은 테이블 정의에 지정된 하나가 될 것입니다 그것은 상관없이 동일하지 않습니다 처음 또는 N 번째의 데이터를 삽입하는 경우

  2. ==============================

    2.당신은 당신의 질문의 편집에 무엇을 쓰기에 맞다.

    당신은 당신의 질문의 편집에 무엇을 쓰기에 맞다.

    DBCC CHECKIDENT ( 'TABLENAME', RESEED, 0)를 실행 한 후 : - 새로 생성 된 테이블의 정체성 0으로 시작됩니다 - 기존 테이블 ID로 계속 1

    이 솔루션은 가난한 - 마르스 - 잘라 내기의 일종, 아래의 스크립트입니다 :)

    -- Remove all records from the Table
    DELETE FROM TableName
    
    -- Use sys.identity_columns to see if there was a last known identity value
    -- for the Table. If there was one, the Table is not new and needs a reset
    IF EXISTS (SELECT * FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = 'TableName' AND last_value IS NOT NULL) 
        DBCC CHECKIDENT (TableName, RESEED, 0);
    
  3. ==============================

    3.로 변경 문

    로 변경 문

      DBCC CHECKIDENT('TableName', RESEED, 1)
    

    (당신이 테이블을 다시 만들 때 또는 1)이 2부터 시작됩니다, 그러나 절대로 0이되지 않을 것입니다.

  4. ==============================

    4.나는 내가 처음으로 ID 열이 0으로 원하는 값을 0으로 재설정 실험으로 이런 짓을하며 일하고있어.

    나는 내가 처음으로 ID 열이 0으로 원하는 값을 0으로 재설정 실험으로 이런 짓을하며 일하고있어.

    dbcc CHECKIDENT(MOVIE,RESEED,0)
    dbcc CHECKIDENT(MOVIE,RESEED,-1)
    DBCC CHECKIDENT(MOVIE,NORESEED)
    
  5. ==============================

    5.그것은 당신이 설정할 수없는 말도 안되는 것 같습니다 / 삽입 여부를 테이블했다 기록의 두 경우 모두를 커버하는 단일 명령으로 ID 열을 다시 설정합니다. 내가 SO에이 질문을 우연히 발견 될 때까지 내가 경험 한 행동을 이해할 수 없었다!

    그것은 당신이 설정할 수없는 말도 안되는 것 같습니다 / 삽입 여부를 테이블했다 기록의 두 경우 모두를 커버하는 단일 명령으로 ID 열을 다시 설정합니다. 내가 SO에이 질문을 우연히 발견 될 때까지 내가 경험 한 행동을 이해할 수 없었다!

    내 솔루션 (추한하지만 작품) 명시 적으로 (표가 삽입 된 기록을 갖고 있는지 여부를 알려줍니다)을 sys.identity_columns.last_value 테이블을 확인하고 각각의 경우에 해당 DBCC CHECKIDENT 명령을 호출하는 것입니다. 다음과 같이이다 :

    DECLARE @last_value INT = CONVERT(INT, (SELECT last_value FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = 'MyTable'));
    IF @last_value IS NULL
        BEGIN
            -- Table newly created and no rows inserted yet; start the IDs off from 1
            DBCC CHECKIDENT ('MyTable', RESEED, 1);
        END
    ELSE
        BEGIN
            -- Table has rows; ensure the IDs continue from the last ID used
            DECLARE @lastValUsed INT = (SELECT ISNULL(MAX(ID),0) FROM MyTable);
            DBCC CHECKIDENT ('MyTable', RESEED, @lastValUsed);
        END
    
  6. ==============================

    6.여기를 참조하십시오 : http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/06/26/fun-with-dbcc-chekident.aspx

    여기를 참조하십시오 : http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/06/26/fun-with-dbcc-chekident.aspx

    이것은 (당신이 FK 관계가없는 경우)이 경우 단계 또는 사용 TRUNCATE를 건너, 테이블을 다시 만들 경우 CHECKIDENT를 실행 왜 동작을 설명되어 있습니다

  7. ==============================

    7.나는 특정 값으로 설정 IDENTITY에 SQL이 사용했다 : -

    나는 특정 값으로 설정 IDENTITY에 SQL이 사용했다 : -

    DECLARE @ID int = 42;
    DECLARE @TABLENAME  varchar(50) = 'tablename'
    
    DECLARE @SQL nvarchar(1000) = 'IF EXISTS (SELECT * FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = '''+@TABLENAME+''' AND last_value IS NOT NULL)
        BEGIN
            DBCC CHECKIDENT('+@TABLENAME+', RESEED,' + CONVERT(VARCHAR(10),@ID-1)+');
        END
        ELSE
        BEGIN
            DBCC CHECKIDENT('+@TABLENAME+', RESEED,' + CONVERT(VARCHAR(10),@ID)+');
        END';
    EXEC (@SQL);
    

    그리고 C #에서이 특정 값을 설정합니다 : -

    SetIdentity(context, "tablename", 42);
    .
    .
    private static void SetIdentity(DbContext context, string table,int id)
    {
        string str = "IF EXISTS (SELECT * FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = '" + table
            + "' AND last_value IS NOT NULL)\nBEGIN\n";
        str += "DBCC CHECKIDENT('" + table + "', RESEED," + (id - 1).ToString() + ");\n";
        str += "END\nELSE\nBEGIN\n";
        str += "DBCC CHECKIDENT('" + table + "', RESEED," + (id).ToString() + ");\n";
        str += "END\n";
        context.Database.ExecuteSqlCommand(str);
    }
    

    이것은 위의 답변을 바탕으로 항상 (이 경우) 반드시 다음 값이 42 있습니다.

  8. ==============================

    8.Zyphrax의 대답에서 대출 ...

    Zyphrax의 대답에서 대출 ...

    USE DatabaseName
    
    DECLARE @ReseedBit BIT = 
        COALESCE((SELECT SUM(CONVERT(BIGINT, ic.last_value))
                    FROM sys.identity_columns ic
                    INNER JOIN sys.tables t ON ic.object_id = t.object_id), 0)
    DECLARE @Reseed INT = 
    CASE 
        WHEN @ReseedBit = 0 THEN 1 
        WHEN @ReseedBit = 1 THEN 0 
    END
    
    DBCC CHECKIDENT ('dbo.table_name', RESEED, @Reseed);
    

    주의 사항 : 이것은 DB가 해당 테이블에 ID 값은 항상 1에 DB가 생성되고 처음 (시작해야합니다 열거 형 정의 테이블로 초기화되는 참조 데이터의 인구 상황에서 사용하기위한 것입니다 예를 들어 SSDT-DB 출판시 ) @Reseed 0 수 있지만 데이터를 재설정 할 때 데이터 및 제거, 즉 그것을 재 - 삽입해야하며,이 코드를 호출 할 수있는 DB 데이터를 재설정 저장 프로 시저에 사용하기위한 것입니다 그래서 다음 1을해야합니다 @Reseed 수동뿐만 아니라 SSDT-DB 프로젝트의 배포 후 스크립트에서 호출됩니다. 이런 식으로 참조 데이터의 삽입은 한 장소에 정의되어 있지만 출판시 이후 배포에 사용되는 제한되지 않습니다, 그들은 저장된 호출하여도 (지원 디바이스 및 자동화 된 테스트 등) 이후 사용할 수 있습니다 절차는 알려진 좋은 상태로 DB를 다시 재설정합니다.

  9. ==============================

    9.간단하게이 작업을 수행 :

    간단하게이 작업을 수행 :

    IF EXISTS (SELECT * FROM tablename)
    BEGIN
        DELETE from  tablename
        DBCC checkident ('tablename', reseed, 0)
    END
    
  10. ==============================

    10.

    USE AdventureWorks2012;  
    GO  
    DBCC CHECKIDENT ('Person.AddressType', RESEED, 0);  
    GO 
    
    
    
    AdventureWorks2012=Your databasename
    Person.AddressType=Your tablename
    
  11. from https://stackoverflow.com/questions/472578/dbcc-checkident-sets-identity-to-0 by cc-by-sa and MIT license