DBCC CHECKIDENT Sets Identity to 0

前端 未结 10 1309
长发绾君心
长发绾君心 2020-12-07 21:55

I\'m using this code to reset the identity on a table:

DBCC CHECKIDENT(\'TableName\', RESEED, 0)

This works fine most of the time, with the f

相关标签:
10条回答
  • 2020-12-07 22:24

    It seems ridiculous that you can't set/reset an identity column with a single command to cover both cases of whether or not the table has had records inserted. I couldn't understand the behavior I was experiencing until I stumbled across this question on SO!

    My solution (ugly but works) is to explicitly check the sys.identity_columns.last_value table (which tells you whether or not the table has had records inserted) and call the appropriate DBCC CHECKIDENT command in each case. It is as follows:

    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
    
    0 讨论(0)
  • 2020-12-07 22:25

    Change statement to

      DBCC CHECKIDENT('TableName', RESEED, 1)
    

    This will start from 2 (or 1 when you recreate table), but it will never be 0.

    0 讨论(0)
  • 2020-12-07 22:28
    USE AdventureWorks2012;  
    GO  
    DBCC CHECKIDENT ('Person.AddressType', RESEED, 0);  
    GO 
    
    
    
    AdventureWorks2012=Your databasename
    Person.AddressType=Your tablename
    
    0 讨论(0)
  • 2020-12-07 22:38

    Borrowing from Zyphrax's answer ...

    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);
    

    Caveats: This is intended for use in reference data population situations where a DB is being initialized with enum type definition tables, where the ID values in those tables must always start at 1. The first time the DB is being created (e.g. during SSDT-DB publishing) @Reseed must be 0, but when resetting the data i.e. removing the data and re-inserting it, then @Reseed must be 1. So this code is intended for use in a stored procedure for resetting the DB data, which can be called manually but is also called from the post-deployment script in the SSDT-DB project. In that way the reference data inserts are only defined in one place but aren't restricted to be used only in post-deployment during publishing, they are also available for subsequent use (to support dev and automated test etc.) by calling the stored procedure to reset the DB back to a known good state.

    0 讨论(0)
提交回复
热议问题