Sql 更改现有标识列';s增量值

Sql 更改现有标识列';s增量值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我被难住了 我正在尝试改变现有MS SQL表集合(都有数据)中标识列的增量值,并一直在尝试研究是否可以不为每个表编写自定义脚本。 我找不到不需要删除和重新创建表的解决方案,因为每个表都有不同的列列表,因此需要为每个表使用不同的脚本 例如,我想更改现有的表 CREATE TABLE [dbo].[ActionType]( [ID] [int] IDENTITY(1,1) NOT NULL, [Action] [varchar](100) NOT NULL, CONSTRAINT

我被难住了

我正在尝试改变现有MS SQL表集合(都有数据)中标识列的增量值,并一直在尝试研究是否可以不为每个表编写自定义脚本。
我找不到不需要删除和重新创建表的解决方案,因为每个表都有不同的列列表,因此需要为每个表使用不同的脚本

例如,我想更改现有的表

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]

通过类似于

exec sp_AlterIncrement @TABLE_NAME = 'ActionType', @NEW_ICREMENT = 5
同时保留数据


这将解决我现在面临的一个大的部署问题,所以任何帮助都将不胜感激

我以前必须在一个小表上这样做,而且这相当容易,诀窍是您必须将它更新为当前不存在的某个键,然后返回,因为您不能将它增加1,因为该键已经存在。它需要2次更新,对于ID小于100的表,例如:

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

但无论如何,我不理解为什么要更改标识值,因为无论如何,您将保持主键或聚集键的一部分不变

此外,如果需要对列类型进行任何更改,那么我认为不改变表结构是不可能的

Alter table ActionType 更改列ID

不需要时,也可以恢复到原始结构。这也可以用于指定的情况,就好像您需要按需提供一样


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

您不能在创建标识增量后更改标识增量。可以使用DBCC Chekident更改种子值。
你应该删除并重新创建专栏。

有几件事,可能信息太多,但在做类似的事情时会有所帮助。以下内容将增量设置为您想要的任何值:

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

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

它包含值,但您希望将其更改为增量,以使其与另一个表很好地配合使用[下面的ex将是B]

所以a将有奇数ID+它用来包含的任何内容。而现在be将有偶数

这个脚本向您展示了如何做

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

如果需要重新计算或压缩标识字段,最简单的方法如下:

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

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

就这些

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


希望有帮助

我正在尝试更改标识列的持续增量值,而不是表数据的内容或标识的实际值,例如我添加了ID 1、2、3,然后将其更改为增量5,然后添加的下一个ID将是4、9、14等。您为什么要这么做?标识字段纯粹用于数据库,不提供任何业务域值。如果有业务原因需要使用具有特定编号方案的业务可见字段,请使用遵循业务规则的附加字段补充标识PK,确保为数据完整性添加唯一索引。只是出于好奇,但您为什么需要这样做?最好的解决方案可能是做一些其他的事情。原因是解决了固定数量的独立数据库的同步问题,真正的问题是如何很好地使现有数据库达到一个点,即当前递增1的标识都更改为递增一个不同的值,我知道可以更改重新设定种子的值。在提出这个问题之后,我一直在研究一种通过redgate sql compare 1创建大型部署脚本的方法。将当前架构写入文件2。在具有新增量3的文件中查找替换。通过与已编辑文件的比较获取数据库同步脚本如果您尝试同步数据库,添加tinyint列并使其成为复合键的一部分不是更容易吗?然后,每个数据库在该复合int+tinyint键中都有其唯一的值。将SQL Server对等复制添加到现有数据库系统就是一个示例,说明了为什么要这样做。在这种复制中,每个对等机上的ID列必须产生不同的值(即ID不能冲突)。在双节点复制(例如)中处理此问题的通常方法是将标识列设置为identity(1,2),将节点1重新设定为奇数,将节点2重新设定为偶数。除非你想提前使用IDENTITY(1,2),否则你是SOL,因为,唉,正如答案中所指出的,你不能在创建表之后更改IDENTITY增量。我知道这听起来不是一个解决方案。但是,从DBA的角度来看,如果标识值变得疯狂,或者以异常的方式增长,那么这是一个很好的解决方案。它意味着使用其他应用程序,如Excel,但它是方便、快速和安全的。
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