更改现有的标识列增量值

时间:2013-10-16 03:40:52

标签: sql sql-server tsql

我很难过,

我正在尝试更改现有MS SQL表(它们都有数据)的集合中Identity列的增量值,并且一直在尝试研究是否可以在不为每个表编写自定义脚本的情况下进行研究。
我找不到一个不需要删除和重新创建表的解决方案,因为每个表都有不同的列列表需要不同的脚本。

例如我想要更改现有的表

CREATE TABLE [dbo].[ActionType](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Action] [varchar](100) NOT NULL,
 CONSTRAINT [PK_ActionType] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[ActionType](
    [ID] [int] IDENTITY(1,5) NOT NULL,
    [Action] [varchar](100) NOT NULL,
 CONSTRAINT [PK_ActionType] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
) ON [PRIMARY]
) ON [PRIMARY]

通过像

这样的东西
exec sp_AlterIncrement @TABLE_NAME = 'ActionType', @NEW_ICREMENT = 5

保留数据。

这将解决我现在面临的一个大型部署问题,所以任何帮助都将受到赞赏

6 个答案:

答案 0 :(得分:2)

创建后无法改变身份增量。只需使用DBCC Chekident更改种子值即可。 您应该删除并重新创建列。

答案 1 :(得分:1)

我之前必须在一张小桌子上这样做,这很容易做到,技巧是你必须将它更新为当前不存在的键,然后返回,因为你不能增加它是1,因为该密钥已经存在。对于ID小于100的表,它需要2次更新:

update my_table set id = id+100;
update my_table set id = id-99;

答案 2 :(得分:0)

但无论如何,我不明白你为什么要改变身份值,因为无论如何你将保持与主键或群集密钥的一部分相同。

此外,如果要求对列类型进行任何更改,那么我认为不存在更改表结构的可能性。

更改表ActionType 更改列ID

您也可以在不需要时恢复原始结构。这也可以用于指定的情况,就像您需要这样。

请建议我以便提供进一步的反馈。

答案 3 :(得分:0)

一些事情,也许是太多的信息,但在做这样的事情时很有帮助。以下内容将增量设置为您想要的值:

DBCC CHECKIDENT ([DB.Schema.Table], reseed, 0) --First record will have a 1. You can set it to any value

如果要将数据插入到具有标识的表中,但需要将值强制为特定的值,请执行以下操作:

SET IDENTITY_INSERT [DB].[schema].[Table] ON

...Add your data here

SET IDENTITY_INSERT [DB].[schema].[Table] OFF

答案 4 :(得分:0)

有时这是必要的。这可能会提供答案。例如,现有表格为identity(1,1) [以下为A]

它包含值,但你想把它改为增量让我们说它适用于另一个表[ex下面将是B]

所以a会有奇怪的id +无论它用于包含什么。而现在会有偶数

此脚本向您展示如何操作。

create table A(id int identity(1,1),v char)

insert into A
Select 'A'
union select 'B'
union select 'C'

go

create table B(id int identity(1,2),v char)

go

SET IDENTITY_INSERT B ON

GO 

insert into B(Id,v)
Select Id,v from A

go

SET IDENTITY_INSERT B OFF
GO 

insert into B
Select 'D'
union select 'E'

go

drop table A

go

EXEC sp_RENAME 'B' , 'A'

go

Select * from A

go

Select max(Id)+1 from A

go

create table B(id int identity(8,2),v char)

go

insert into B
Select 'A'
union select 'B'
union select 'C'

go


Select * from B

答案 5 :(得分:0)

如果您需要重新枚举或压缩您的身份字段,最简单的方法如下:

暂时将您的身份转换为整数 使用例如其他Excel表格替换值以填充它们 将Excel文件中的列复制并粘贴到Int字段中。 保存表格 在设计模式下再次打开它并将Int字段更改回Identity

如果在子表中使用此标识字段,请确保您有一个触发器,以便将新值导出到从属表中。

就是这样。

如果您需要在应用程序中控制身份数据,只需将其更改为Int并使用Dmax函数代码管理增量值。

希望有所帮助