【问题标题】:How to change programmatically non-identity column to identity one?如何以编程方式将非身份列更改为身份一?
【发布时间】:2009-04-16 14:23:53
【问题描述】:

我有一个列 ID 为标识一的表。接下来,我创建新的非标识列 new_ID 并使用 ID 列 + 1 中的值对其进行更新。像这样:

new_ID = ID + 1

接下来,我删除 ID 列并将 new_ID 重命名为“ID”。

以及如何在这个新列“ID”上设置身份?

我想以编程方式执行此操作!

【问题讨论】:

  • Tomaszs,正如我写给你的,你可以创建一个可以从你的应用程序调用的脚本。但是,我相信您会明白,按照您的要求执行此操作非常耗时,而且您需要确保同时没有人在使用这些表。

标签: sql sql-server sql-server-2005 tsql identity


【解决方案1】:

据我所知,您必须创建一个临时表,其中 ID 字段创建为 IDENTITY,然后从原始表中复制所有数据。最后,删除原始表并重命名临时表。这是一个表(名为 TestTable)的示例,其中仅包含一个字段,称为 ID(整数,非 IDENTITY):

BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_TestTable
    (
    ID int NOT NULL IDENTITY (1, 1)
    )  ON [PRIMARY]
GO
SET IDENTITY_INSERT dbo.Tmp_TestTable ON
GO
IF EXISTS(SELECT * FROM dbo.TestTable)
     EXEC('INSERT INTO dbo.Tmp_TestTable (ID)
        SELECT ID FROM dbo.TestTable WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_TestTable OFF
GO
DROP TABLE dbo.TestTable
GO
EXECUTE sp_rename N'dbo.Tmp_TestTable', N'TestTable', 'OBJECT' 
GO
COMMIT

【讨论】:

  • 嘿,如果我添加了代码,我写的内容会看起来好多了:P +1
  • 是的,如果我有 43 个这样的表怎么办?
  • Tomaszs,恐怕你别无选择。如果您必须“转换”一次 ID,您可以创建一个可以完成所有操作的脚本。如果您必须经常这样做,那么我会开始考虑审查数据库结构。
  • 这家伙需要一个 DBA - 我希望他不是负责人!
【解决方案2】:

看起来 SQL Mobile 支持更改列标识,但在 SQL Server 2005 上不喜欢 BOL 中的示例。

因此您的选择是使用标识列创建一个新的临时表,然后打开标识插入:

Create Table Tmp_MyTable ( Id int identity....)

SET IDENTITY_INSERT dbo.Tmp_Category ON

INSERT Into Tmp_MyTable (...)
Select From MyTable ....

Drop Table myTable

EXECUTE sp_rename N'dbo.Tmp_MyTable', N'MyTable', 'OBJECT' 

此外,您可以尝试首先将该列添加为标识列,然后打开标识插入。然后删除原始列。但我不确定这是否可行。

【讨论】:

    【解决方案3】:

    猜你的任务不太走运......

    在表设计中,您应该能够进入属性并在身份规范下将身份规范更改为“是”并分配列主键(如果它以前具有主键)。

    【讨论】:

    • 如果您这样做,正如@tanner 所述,它将为您生成一个脚本,您可以查看并了解它是如何完成的
    【解决方案4】:

    【讨论】:

    • 我因发布链接而遭到反对?或者发布一个到 SQL Server Central?无论如何,有问题的文章提供了几种类似于已经给出的答案的方法。是的,您必须注册,但它是免费的,而且该网站值得。
    【解决方案5】:

    身份是在创建表或在 alter table 语句中添加新列时设置的属性。您不能更改该列并将其设置为标识,并且在同一个表中不可能有两个标识列。

    根据表的大小,是否可以简单地创建一个新表?复制旧的模式,然后使用 SET IDENTITY_INSERT ON 用旧的模式填充新的身份列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-04
      • 2011-11-15
      • 2019-12-06
      • 2021-12-18
      • 2014-10-12
      • 2013-01-29
      • 2014-04-28
      • 1970-01-01
      相关资源
      最近更新 更多