请参阅下面的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订单会尊重他们输入表格的顺序吗?例如首先输入Ian,因此他的ID为1.安妮是输入的第一百万行,因此ID为1,000,000。
答案 0 :(得分:2)
未定义IDENTITY
值分配给现有行的顺序。使用堆示例,SQL Server可能会以用于存储行的文件/页面/槽的物理顺序分配值。如果这与插入顺序匹配,则只能通过偶然事件而不应依赖。空间分配和重用可能导致数据的物理顺序与原始插入顺序不同,因为数据库可能包含多个文件。
如果表具有聚簇索引,则可能会按聚簇索引键的顺序分配值,但同样不要指望它。关系数据库表在逻辑上是一组无序行,应始终如此处理。
如果您有一个增量列来派生插入顺序,则可以使用IDENTITY
查询中的SELECT...INTO...ORDER BY
函数创建一个新表,其中包含以所需顺序分配的标识值。前进插入的新行的标识值将按插入顺序递增。