如何控制 SQL Server 中新标识列的分配顺序?

Posted

技术标签:

【中文标题】如何控制 SQL Server 中新标识列的分配顺序?【英文标题】:How to control order of assignment for new identity column in SQL Server? 【发布时间】:2010-03-15 19:56:35 【问题描述】:

我有一个带有CreateDate datetime 字段default(getdate()) 的表,它没有任何标识列。

我想添加 identity(1,1) 字段,该字段将反映与 CreateDate 字段相同的现有记录顺序(order by 将给出相同的结果)。我该怎么做?

我想如果我在 CreateDate 字段上创建聚集键,然后添加标识列它将起作用(不确定是否有保证),有没有更好/更好的方法?

我对 SQL Server 2005 感兴趣,但我想 SQL Server 2008、SQL Server 2000 的答案会是一样的。

【问题讨论】:

【参考方案1】:

从 Remus 的 理论 回答开始……您需要先生成一个具有理想顺序的列表

SELECT
    ID, CreateDate
INTO
    MyNewTable
FROM
    (
    SELECT
        CreateDate,
        ROW_NUMBER() OVER (ORDER BY CreateDate ASC) AS ID
    FROM
        MyTable
    ) foo

然后,最好的解决方案是使用 SSMS 将 IDENTITY 属性添加到 MyNewTable。 SSMS 将生成一个包含SET IDENTITY INSERT 的脚本以保留订单

注意:IDENTITY 列只是没有隐含意义的数字,在本练习之后,不应通过它们与 CreateDate 的对齐来推断任何内容...

【讨论】:

【参考方案2】:

IN SQL 2012 使用序列号而不是标识列。 http://msdn.microsoft.com/en-us/library/ff878058.aspx

【讨论】:

【参考方案3】:

IDENTITY 值通常与物理存储顺序正交。特别是,由于 3 毫秒的日期时间分辨率允许多行具有相同的日期时间,因此身份并不总是与日期时间聚集键顺序匹配。此外,如果原始时间绑定到客户端机器(即中间层、asp 层、用户机器等),那么机器之间的时间漂移​​也将确保插入顺序(IDENTITY 给出的)和存储顺序之间的差异。

如果您需要行顺序整数,请在投影列表中使用 ROW_NUMBER()。如果出于 ORM 目的需要 IDENTITY 主键,请使用 IDENTITY 列并将其作为非聚集索引进行索引。

切勿将物理存储要求(集群键)与逻辑建模要求(主键)混淆。

【讨论】:

对不起,那是我。我不相信你完全回答了这个问题。我同意您的陈述(除了我的身份列几乎总是聚集索引),但它们没有帮助。他想通过添加自动编号字段来改进他的设计/清晰度/索引/外键;我曾多次遇到过他的情况。我敢肯定他希望一开始就有一个自动编号。他希望它们至少在某种程度上与添加它们的顺序相匹配,而不是从随机数开始。有总比没有好。如何做到这一点是他的问题。 是的,但是在他添加标识列之后下一步会发生什么?他所珍视的物理秩序-身份价值映射将在 5 分钟内消失。我的整个帖子都是关于如何从不依赖这样的映射。 我无法想象他会这样。他可能只需要一个好的外键。或者,以前的聚集索引是一些可怕的、巨大的“自然键”,现在他需要为他的非聚集索引等提供性能。或者它是一个多字段键,他正试图带来一些理智。【参考方案4】:

正如您所怀疑的,它将根据聚集索引添加它们。否则,您将不得不在某个地方的代码中执行此操作。

【讨论】:

不,不会。只有 ORDER BY 子句才能保证 ORDER @gbn 每次我插入一个标识列时,自动编号的顺序都与聚集索引相匹配。我依靠这种行为来获得我想要的订单。你是说这种行为是不能保证的,也可能不会发生,我很幸运? @Patrick:IDENTITY 可能会留下空隙,MSDN 上记录了这一点:“如果表的身份列存在频繁删除,则身份值之间可能会出现空隙。” @gbn 这当然是真的,但它是如何应用的呢?在他的情况下,还没有身份列。他想知道如何添加一个标识列(在创建时)遵循 CreateDate 列的顺序(当然最好,因为 CreateDate 可能有重复的值)。在他这样做之后,两者当然可以/将会分歧,但这与他的问题无关。如果他在 CreateDate 上有一个聚集索引,那么在他添加一个新的身份字段的那一刻,它将有一个遵循 CreateDate 的顺序。你是说这不是事实? @Remus Rusanu woops,以上评论是对您的评论的回应。

以上是关于如何控制 SQL Server 中新标识列的分配顺序?的主要内容,如果未能解决你的问题,请参考以下文章

SQL:合并表中列的相似值并为其分配标识符

检索sql server中新插入行的值

SQL Server中的标识列

使用sql语句创建修改SQL Server标识列(即自动增长列)

使用sql语句创建修改SQL Server标识列(即自动增长列)

在具有标识列的 SQL Server Compact 4.0 表中插入的性能呈指数下降