Sql 添加标识列-ID的顺序

Sql 添加标识列-ID的顺序,sql,sql-server,Sql,Sql Server,请参见下面的DDL: create table #test (name varchar(10),dateofbirth datetime) insert into #test values ('ian', '1976-09-08') insert into #test values ('maria', '1976-09-08') 我意识到没有主键是一个糟糕的设计选择。我想添加一个新的标识列,如下所示: alter table #test add id int identity 这与我预期的

请参见下面的DDL:

create table #test (name varchar(10),dateofbirth datetime)

insert into #test values ('ian', '1976-09-08')
insert into #test values ('maria', '1976-09-08')
我意识到没有主键是一个糟糕的设计选择。我想添加一个新的标识列,如下所示:

alter table #test add id int identity
这与我预期的一样有效,即Ian的ID为1,Maria的ID为2


此表中有1000万行。我是否可以假定ID顺序将尊重他们输入表中的顺序?e、 伊恩是第一个被输入的,所以他的ID是1。Anne是输入的第一百万行,因此ID为1000000。

未定义将
IDENTITY
值分配给现有行的顺序。以堆为例,SQL Server可能会按照用于存储行的文件/页面/插槽的物理顺序分配值。如果这与插入顺序相匹配,那么这只是偶然的,不应该依赖。空间分配和重用可能会导致数据的物理顺序与原始插入顺序不同,对于包含多个文件的数据库也是如此

如果表有聚集索引,则值可能会按照聚集索引键的顺序分配,但同样,不要指望它。关系数据库表在逻辑上是一组无序的行,应该始终这样对待


如果您有一个增量列来导出插入顺序,则可以使用
SELECT…INTO…order BY
查询中的
IDENTITY
函数来创建一个新表,其中标识值按所需顺序分配。向前插入的新行的标识值将按插入顺序递增。

是否为表堆?没有聚集索引?@lad2025如问题中所述,没有PK。我没有设计它。为什么身份顺序与原始插入顺序匹配很重要?如果没有,你怎么知道呢?我想知道一些记录是什么时候被添加到表中的。第一天增加了一百万;第二天再增加一百万,等等。有一个timestap会很好。我认为你最希望的(除非你有数据库和事务日志备份以及评估这些更改的方法)是修改你的表设计,包括一个datetime字段,并接受在添加字段之前不能提供任何信息。在SQL中,您永远不能假设任何关于排序的内容,除非它是用ORDERBY显式表示的。我找不到任何特定于现有表中新标识字段顺序的内容,绝对不会将其视为安全的假设。