首页 >数据库 >mysql教程 >如何使用 ROW_NUMBER() 在没有标识列的情况下自动递增数据?

如何使用 ROW_NUMBER() 在没有标识列的情况下自动递增数据?

DDD
DDD原创
2025-01-04 21:53:40876浏览

How Can I Auto-Increment Data Without an Identity Column Using ROW_NUMBER()?

使用不带 ORDER BY 的 ROW_NUMBER() 自动递增数据

将数据插入到没有标识列的表中时,有必要找到自动递增主键的替代方法。一种常用的方法是 ROW_NUMBER() 函数,它允许对行进行顺序编号。

传统上,ROW_NUMBER() 函数需要 ORDER BY 子句来确定行的顺序。但是,在某些情况下,合法的排序字段不可用。为了解决这个问题,存在一种解决方法,涉及在 ORDER BY 子句中使用任意常量表达式,例如 (SELECT 1)。

通过将此技术与 OVER() 子句相结合,可以计算每行的行号,而不指定特定顺序:

Row_Number() OVER (ORDER BY (SELECT 1))

然后可以在 INSERT 语句中使用此表达式来自动递增主行key:

INSERT INTO dbo.TargetTable (ID, FIELD)
SELECT
   Row_Number() OVER (ORDER BY (SELECT 1))
      + Coalesce(
         (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)),
         0
      ),
   FieldValue
FROM dbo.SourceTable
WHERE {somecondition};

但是,请务必注意,此解决方法不能保证保留 SourceTable 中行的原始顺序。事实上,可能还有其他因素影响结果的最终排序。这是因为“未排序(以特定方式)”与“保留原始顺序”的概念不同。

因此,使用标识列进行主键自增通常被认为优于 ROW_NUMBER( )解决方法。它不仅消除了复杂计算的需要,还通过确保每一行都有唯一且不冲突的 ID 来提高并发性和数据完整性。

以上是如何使用 ROW_NUMBER() 在没有标识列的情况下自动递增数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn