4

我被难住了,

我正在尝试更改现有 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]

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

在保留数据的同时。

这将解决我现在面临的一个重大部署问题,因此将不胜感激

4

6 回答 6

3

创建后不能更改身份增量。可以仅使用 DBCC Chekident 更改种子值。您应该删除并重新创建该列。

于 2013-10-16T13:03:49.940 回答
1

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

update my_table set id = id+100;
update my_table set id = id-99;
于 2013-10-16T04:25:32.363 回答
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
于 2013-10-16T19:35:27.097 回答
0

但无论如何,我不明白您为什么要更改标识值,因为无论如何您将保持与主键或集群键的一部分相同。

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

更改表 ActionType 更改列 ID

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

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

于 2013-10-16T04:38:20.027 回答
0

有时这是必要的。这可能会提供答案。例如现有表是identity(1,1)[ex below will be A]

它包含值,但您想将其更改为增量,假设它可以与另一个表很好地配合使用[例如下面是 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
于 2017-02-21T04:41:01.343 回答
0

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

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

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

就这样。

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

希望能帮助到你

于 2017-09-16T23:51:50.890 回答