【问题标题】:Set auto id to primary key column [duplicate]将自动ID设置为主键列[重复]
【发布时间】:2014-03-12 12:34:13
【问题描述】:

我有一个表并且主键已经设置为该表,现在我希望该列自动递增。表有很多记录。可能吗?或者哪一种是最快的方法?

【问题讨论】:

  • 简而言之:无法对现有列执行此操作,请参阅上面的链接了解解决方法
  • 你当前的主键有什么问题?

标签: sql-server


【解决方案1】:

我认为您必须为此付出一些努力,因为您无法在现有列上创建标识列。但是,您可能有一个解决方法,例如首先尝试添加一个具有标识字段的新列:

ALTER TABLE dbo.Table_name
   ADD ID INT IDENTITY

然后将您的 ID 设为主键,如下所示:

ALTER TABLE dbo.Table_name
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

是的,您必须在执行上述步骤之前删除旧的依赖项:

ALTER TABLE Table_name
DROP CONSTRAINT PK_Table1_Col1

编辑:-

来自source

我们可以使用 ALTER TABLE...SWITCH 来解决这个问题,只需修改元数据。有关使用下面介绍的 SWITCH 方法的限制,请参阅联机丛书。即使对于最大的桌子,这个过程也几乎是即时的。

USE tempdb;
GO
-- A table with an identity column
CREATE TABLE dbo.Source (row_id INTEGER IDENTITY PRIMARY KEY NOT NULL, data SQL_VARIANT NULL);
GO
-- Some sample data
INSERT dbo.Source (data) 
VALUES (CONVERT(SQL_VARIANT, 4)), 
        (CONVERT(SQL_VARIANT, 'X')), 
        (CONVERT(SQL_VARIANT, {d '2009-11-07'})),
        (CONVERT(SQL_VARIANT, N'áéíóú'));
GO
-- Remove the identity property
BEGIN TRY;
    -- All or nothing
    BEGIN TRANSACTION;

    -- A table with the same structure as the one with the identity column,
    -- but without the identity property
    CREATE TABLE dbo.Destination (row_id INTEGER PRIMARY KEY NOT NULL, data SQL_VARIANT NULL);

    -- Metadata switch
    ALTER TABLE dbo.Source SWITCH TO dbo.Destination;

    -- Drop the old object, which now contains no data
    DROP TABLE dbo.Source;

    -- Rename the new object to make it look like the old one
    EXECUTE sp_rename N'dbo.Destination', N'Source', 'OBJECT';

    -- Success
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- Bugger!
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
    PRINT ERROR_MESSAGE();
END CATCH;
GO

-- Test the the identity property has indeed gone
INSERT dbo.Source (row_id, data)
VALUES (5, CONVERT(SQL_VARIANT, N'This works!'))

SELECT row_id,
        data
FROM    dbo.Source;
GO

-- Tidy up
DROP TABLE dbo.Source;

【讨论】:

  • 您错过了“删除旧密钥和依赖项”步骤
  • @gvee:- 感谢您的建议。更新了我的答案!
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 2012-07-03
  • 2017-08-13
  • 2020-06-04
  • 2012-07-31
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
相关资源
最近更新 更多