SQLServer,如何在创建表后设置自动增量而不丢失数据?

SQLServer,如何在创建表后设置自动增量而不丢失数据?

我有张桌子table1在Sqlserver 2008中,其中有记录。

我要主键table1_Sno列为自动递增列。在不进行任何数据传输或表克隆的情况下,能做到这一点吗?

我知道我可以使用ALTERTABLE来添加一个自动增量列,但是我可以简单地将AUTO_CREATION选项添加到作为主键的现有列中吗?


长风秋雁
浏览 877回答 3
3回答

温温酱

更改IDENTITY属性实际上是元数据只进行更改。但是,要直接更新元数据,需要在单用户模式下启动实例,并在sys.syscolpars而且是没有文件记录的/没有支持的,不是我会推荐的东西,也不是我会给出的任何其他细节。对于在SQLServer 2012+上遇到这个答案的人来说,要实现自动递增列的结果,最简单的方法是创建一个SEQUENCE对象并设置next value for seq作为列的默认值。或者,对于以前的版本(从2005年起),这个解决方案发布在此连接项显示了一种完全支持的方法来完成此操作,而不需要使用ALTER TABLE...SWITCH..还在MSDN上发表博客这里..尽管实现这一目标的代码并不简单,而且也存在一些限制-例如要更改的表不能成为外键约束的目标。示例代码。设置测试表identity列。CREATE&nbsp;TABLE&nbsp;dbo.tblFoo&nbsp; (bar&nbsp;INT&nbsp;PRIMARY&nbsp;KEY,filler&nbsp;CHAR(8000),filler2&nbsp;CHAR(49))INSERT&nbsp;INTO&nbsp;dbo.tblFoo&nbsp;(bar)SELECT&nbsp;TOP&nbsp;(10000)&nbsp;ROW_NUMBER()&nbsp;OVER &nbsp;(ORDER&nbsp;BY&nbsp;(SELECT&nbsp;0))FROM&nbsp;master..spt_values&nbsp;v1,&nbsp;master..spt_values&nbsp;v2修改为有一个identity列(或多或少是瞬间的)。BEGIN&nbsp;TRY; &nbsp;&nbsp;&nbsp;&nbsp;BEGIN&nbsp;TRANSACTION; &nbsp;&nbsp;&nbsp;&nbsp;/*Using&nbsp;DBCC&nbsp;CHECKIDENT('dbo.tblFoo')&nbsp;is&nbsp;slow&nbsp;so&nbsp;use&nbsp;dynamic&nbsp;SQL&nbsp;to &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;the&nbsp;correct&nbsp;seed&nbsp;in&nbsp;the&nbsp;table&nbsp;definition&nbsp;instead*/ &nbsp;&nbsp;&nbsp;&nbsp;DECLARE&nbsp;@TableScript&nbsp;nvarchar(max) &nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;@TableScript&nbsp;=&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;' &nbsp;&nbsp;&nbsp;&nbsp;CREATE&nbsp;TABLE&nbsp;dbo.Destination( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bar&nbsp;INT&nbsp;IDENTITY('&nbsp;+&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAST(ISNULL(MAX(bar),0)+1&nbsp;AS&nbsp;VARCHAR)&nbsp;+&nbsp;',1)&nbsp;&nbsp;PRIMARY&nbsp;KEY, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filler&nbsp;CHAR(8000), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filler2&nbsp;CHAR(49) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ALTER&nbsp;TABLE&nbsp;dbo.tblFoo&nbsp;SWITCH&nbsp;TO&nbsp;dbo.Destination; &nbsp;&nbsp;&nbsp;&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;dbo.tblFoo&nbsp;&nbsp;&nbsp;&nbsp;WITH&nbsp;(TABLOCKX,HOLDLOCK) &nbsp;&nbsp;&nbsp;&nbsp;EXEC(@TableScript) &nbsp;&nbsp;&nbsp;&nbsp;DROP&nbsp;TABLE&nbsp;dbo.tblFoo; &nbsp;&nbsp;&nbsp;&nbsp;EXECUTE&nbsp;sp_rename&nbsp;N'dbo.Destination',&nbsp;N'tblFoo',&nbsp;'OBJECT'; &nbsp;&nbsp;&nbsp;&nbsp;COMMIT&nbsp;TRANSACTION;END&nbsp;TRYBEGIN&nbsp;CATCH&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;XACT_STATE()&nbsp;<>&nbsp;0&nbsp;ROLLBACK&nbsp;TRANSACTION; &nbsp;&nbsp;&nbsp;&nbsp;PRINT&nbsp;ERROR_MESSAGE();END&nbsp;CATCH;测试结果。INSERT&nbsp;INTO&nbsp;dbo.tblFoo&nbsp;(filler,filler2)&nbsp;OUTPUT&nbsp;inserted.*VALUES&nbsp;('foo','bar')施予bar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filler&nbsp;&nbsp;&nbsp;&nbsp;filler2-----------&nbsp;---------&nbsp;---------10001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bar洗净DROP&nbsp;TABLE&nbsp;dbo.tblFoo
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server