将当前表列更新为标识列

3

可能是重复问题:
在列上设置标识

我有一个表,例如Messages,其中有一个名为Serno的列。 Serno记录每个消息的序列号。 但是系统非常旧,使用max(serno)命令创建此序列号。 现在,我正在尝试将此列更改为标识,但我不想失去每条消息的当前序列号。

有没有解决方案。

我已经尝试创建一个新的标识列并将值从serno复制到那里,但它不起作用。 创建新表也不起作用,因为数据库会为每个消息提供新的序列号,而我不希望如此。

欢迎任何想法。

提前致谢

M.A


请查看这篇文章。我认为它会帮助您解决问题。 SQL SERVER - 在列上添加或删除标识属性 - manish chavda
2个回答

1

您尝试过在设计视图中打开表格,选择您的列,并将 IdentitySpecification 设置为 Yes 吗?(如果您有许多行,则可能需要一些时间,因为它会内部生成完整的表格副本)


是的,我已经尝试过了。它给了我一个错误,说我必须重新创建表。谢谢。 - M.A
1
在SSMS Studio中,选择“工具->选项->设计师”,然后取消标记为“防止保存需要重新创建表的更改”的框。 - paul
我曾经担心这样做会使约束和索引失效。但是我进行了测试,一切都很完美!感谢您的帮助!! - M.A

1

您无法更改现有列并将其设置为标识列。

您需要创建一个临时表,并将值插入其中。最后,您必须删除实际表并将临时表重命名为实际表。

CREATE TABLE dbo.NewTable(ID int IDENTITY(1, 1),<other columns>)

SET IDENTITY_INSERT dbo.NewTable ON

INSERT  INTO dbo.NewTable ( Id, <other columns>)
SELECT  Id,  <other columns> FROM    <actual_table>
go

SET IDENTITY_INSERT dbo.NewTable OFF
go

DROP TABLE your_table
go

Exec sp_rename 'NewTable', 'actual_table'

由于ID是一个标识符,它不允许我更新这个字段! - M.A
@M.A:一旦你执行了 SET IDENTITY_INSERT dbo.NewTable ON,那么它就会起作用。 - Joe G Joseph
由于这是一个插入操作,可能会起作用...我会尝试一下并让您知道结果。感谢您的帮助! - M.A
你可以更改现有的列并将其设置为标识列。请参见我在可能的重复问题中的答案。 - Martin Smith
我正在使用以下代码:SET IDENTITY_INSERT dbo.MessagesOLD ONINSERT INTO MessagesOLD select * from Messages但是我遇到了错误:Msg 8101, Level 16, State 1, Line 1 只有在使用列清单并且启用了IDENTITY_INSERT时,才能为表'MessagesOLD'中的标识列指定显式值。 - M.A
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接