SQL Server,如何设置建表后自增而不丢失数据?

2024-04-08

我有一张桌子table1在 SQL Server 2008 中,它有记录。

我想要主键table1_Sno列是自动递增列。可以在不进行任何数据传输或表克隆的情况下完成此操作吗?

我知道我可以使用 ALTER TABLE 添加自动增量列,但是我可以简单地将 AUTO_INCREMENT 选项添加到作为主键的现有列吗?


改变IDENTITY属性实际上只是元数据的更改。但是要直接更新元数据需要以单用户模式启动实例并处理一些列sys.syscolpars并且没有记录/不受支持,我不会推荐或提供任何其他详细信息。

对于在 SQL Server 2012+ 上遇到这个答案的人来说,到目前为止,实现自动递增列结果的最简单方法是创建一个SEQUENCE对象并设置next value for seq作为列默认值。

或者,对于以前的版本(从 2005 年起),解决方法发布在这个连接项目 http://connect.microsoft.com/SQLServer/feedback/details/252226/allow-enabling-and-disabling-of-a-columns-identity-property显示了一种完全受支持的方法,无需使用数据操作的大小ALTER TABLE...SWITCH。还在 MSDN 上发表了博客here http://blogs.msdn.com/b/dfurman/archive/2010/04/20/adding-the-identity-property-to-a-column-of-an-existing-table.aspx。尽管实现此目的的代码不是很简单并且存在一些限制 - 例如正在更改的表不能成为外键约束的目标。

示例代码。

设置测试表,无identity column.

CREATE TABLE dbo.tblFoo 
(
bar INT PRIMARY KEY,
filler CHAR(8000),
filler2 CHAR(49)
)


INSERT INTO dbo.tblFoo (bar)
SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM master..spt_values v1, master..spt_values v2

改变它有一个identity列(或多或少是即时的)。

BEGIN TRY;
    BEGIN TRANSACTION;

    /*Using DBCC CHECKIDENT('dbo.tblFoo') is slow so use dynamic SQL to
      set the correct seed in the table definition instead*/
    DECLARE @TableScript nvarchar(max)
    SELECT @TableScript = 
    '
    CREATE TABLE dbo.Destination(
        bar INT IDENTITY(' + 
                     CAST(ISNULL(MAX(bar),0)+1 AS VARCHAR) + ',1)  PRIMARY KEY,
        filler CHAR(8000),
        filler2 CHAR(49)
        )

        ALTER TABLE dbo.tblFoo SWITCH TO dbo.Destination;
    '       
    FROM dbo.tblFoo
    WITH (TABLOCKX,HOLDLOCK)

    EXEC(@TableScript)


    DROP TABLE dbo.tblFoo;

    EXECUTE sp_rename N'dbo.Destination', N'tblFoo', 'OBJECT';


    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
    PRINT ERROR_MESSAGE();
END CATCH;

测试结果。

INSERT INTO dbo.tblFoo (filler,filler2) 
OUTPUT inserted.*
VALUES ('foo','bar')

Gives

bar         filler    filler2
----------- --------- ---------
10001       foo       bar      

Clean up

DROP TABLE dbo.tblFoo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server,如何设置建表后自增而不丢失数据? 的相关文章

随机推荐

  • 如何在 Windows 上设置 NODE_ENV=生产?

    在 Ubuntu 中这非常简单 我可以使用以下方式运行该应用程序 NODE ENV production node myapp app js 但是 这在 Windows 上不起作用 是否有可以设置属性的配置文件 当前版本的 Windows
  • 如何在prototxt文件中写注释?

    我找不到如何写评论prototxt files 有没有办法在 prototxt 文件中添加注释 如何 Thanks 您可以通过添加评论 char 之后的行中的所有内容都是注释 layer name aLayerWithComments I
  • 新的 Kubernetes 服务帐户似乎具有集群管理员权限

    我在新创建的 Kubernetes 服务帐户中遇到了奇怪的行为 看来他们的令牌在我们的集群中提供了无限的访问权限 如果我创建一个新的命名空间 在该命名空间内创建一个新的服务帐户 然后在新的 kube 配置中使用该服务帐户的令牌 我就能够在集
  • Python 中或仅 JavaScript 中的 BigQuery UDF

    我一直在研究如何在 BigQuery 中编写 UDF 并发现了以下语法 CREATE TEMPORARY TEMP FUNCTION function name named parameter RETURNS data type LANGU
  • 使用 Windows 身份验证的 Asp.Net Core 2.x Web 应用程序中的 User.Identity.Name 为 null

    Problem 当在 IIS 后面托管 Asp Net Core 2 0 或 2 1 Web 应用程序且 Windows 身份验证设置为 true 且匿名身份验证设置为 false 时 User Identity Name属性为 null
  • 制作类似支持自动删除临时文件和正则表达式模式规则的工具?

    我正在搜索一个类似 make 的构建工具 它支持 除了通常的 make 功能之外 自动删除临时创建的文件 例如在 GNU make 中 规则模式中的正则表达式 例如Cook http miller emu id au pmiller sof
  • 给定数的所有因数

    例如 我有 4800 我想查看这个数字的所有因数 num the number you want factors of def factors of num 1 num collect n n num n if num n n num co
  • 自动识别Pitest中哪些测试用例杀死了哪些突变体

    我正在使用 Pitest 进行突变测试 我的项目需要大量突变体 例如 500 个突变体 我需要一个矩阵来显示 Pitest 创建了哪些突变体 并被哪些测试用例杀死 我可以手动完成 但需要很长时间 可以自动完成吗 如果是 如何解决 如果否 我
  • Android ImageView NullPointerException

    我有两个图像 一个是红灯 一个是绿灯 我有一个自定义 ListView 我想在列表项处于非活动状态时显示红灯 在列表项处于活动状态时显示绿灯 按下时会激活列表项 这是我的代码 row xml
  • CSS,div 内的居中链接

    我怎样才能像这样集中我的链接 它们都集中在一个div 但它们从相同的距离开始 i am link 1 i am a longer link than link 1 i am a short link we are all centered
  • 有没有办法将文件的内容传递给curl?

    我想从命令行执行一个相当复杂的具有多部分 混合边界的 HTTP 请求 POST batch HTTP 1 1 Host www googleapis com Content length 592 Content type multipart
  • 使用 JMeter 将文件上传到 Rest API

    注意 我已经检查过BlazeMeter 教程 https www blazemeter com blog testing advanced rest api file uploads jmeter当我使用 文件上传 选项卡时 它将文档作为正
  • Python Excel 突出显示单元格差异

    前言 我是新人 自学成才 这是我的第一个编码项目 我知道这很糟糕 一旦完成并工作 我将重写它 我正在尝试编写一个 python 脚本来比较 2 个 Excel 文件并突出显示不同的单元格 我可以打印出差异 使用 pandas 并突出显示一个
  • 后台获取似乎不会发生火灾

    在我的应用程序中 我执行了下面列出的操作 并向应用程序提取例程添加了计数器 以突出显示 iOS 8 1 调用提取的次数 打开后台模式并启用后台获取 为 performFetchWithCompletionHandler 编写代码 NSLog
  • XSD 验证错误:“cvc-elt.1:找不到元素 'xs:schema' 的声明”

    我正在尝试使用 Maven XML 插件根据模式验证我的 xml 但我一直收到错误消息 cvc elt 1 找不到元素 xs schema 的声明 我想它必须处理我的名称空间声明 所以它们是 在我的 XSD 中
  • 如何设置 Visual Studio 2012 使用 JavaScript 编辑器处理 asp 文件

    如何告诉 Visual Studio 2012 将经典 ASP 文件 扩展名 asp 识别为 JavaScript 我已将 asp 扩展名注册到脚本编辑器 这在 2010 年曾经起到过作用 但现在没有帮助 VS 似乎不知道脚本编辑器使用什么
  • NLTK v3.2:无法 nltk.pos_tag()

    嗨 文本挖掘冠军 我在 Windows 10 上使用 Anaconda 和 NLTK v3 2 客户端环境 当我尝试 POS 标记时 我不断收到 URLLIB2 错误 URLError
  • cakephp render-false 操作仍然回显 html 模板

    对于控制器中不需要视图的操作 我将禁用布局和模板 如下所示 this gt autoRender false 一切都很好 然而 在同一操作中 我会回显 通过 或 失败 来表明我对结果的看法 问题是一堆文本也被回显 我的 失败 或 通过 在最
  • 如何在 Crypto++ 中使用 Shamir 秘密共享类

    我尝试使用秘密共享 http www cryptopp com docs ref class secret sharing htmlCrypto 中的类 但我无法使其工作 这是我的代码 using namespace CryptoPP vo
  • SQL Server,如何设置建表后自增而不丢失数据?

    我有一张桌子table1在 SQL Server 2008 中 它有记录 我想要主键table1 Sno列是自动递增列 可以在不进行任何数据传输或表克隆的情况下完成此操作吗 我知道我可以使用 ALTER TABLE 添加自动增量列 但是我可