Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL server-在现有表中添加标识列在内部如何工作?_Sql Server_Database Design_Architecture_Identity Column - Fatal编程技术网

Sql server SQL server-在现有表中添加标识列在内部如何工作?

Sql server SQL server-在现有表中添加标识列在内部如何工作?,sql-server,database-design,architecture,identity-column,Sql Server,Database Design,Architecture,Identity Column,我有一个包含100行的表,但我的主键列不具有identity属性。(但此列的值看起来像identity列和sequential:1-100) 现在,我尝试用下面的代码添加新的标识列 alter table tableA add new_Iden_col bigint identity(1,1) 但是我发现新的列标识值并没有按照主键列的顺序排序 那么,有人能解释一下,为什么新添加的列与主键列不同,尽管旧列值是以相同的方式自然填充的,而不是为输出动态排序的 提前感谢。:) 可以使用IDENTIT

我有一个包含100行的表,但我的主键列不具有identity属性。(但此列的值看起来像identity列和sequential:1-100) 现在,我尝试用下面的代码添加新的标识列

alter table tableA add new_Iden_col bigint identity(1,1)
但是我发现新的列标识值并没有按照主键列的顺序排序

那么,有人能解释一下,为什么新添加的列与主键列不同,尽管旧列值是以相同的方式自然填充的,而不是为输出动态排序的


提前感谢。:)

可以使用
IDENTITY
功能创建一个新的
IDENTITY
列,并按照
SELECT…INTO的
ORDER by
子句指定的顺序分配增量值。下面是一个示例,创建一个新的
IDENTITY
列,用作旧主键列顺序中的新主键

SELECT 
    IDENTITY(bigint, 1,1) AS new_Ident_col
  , OtherData
INTO FROM dbo.TableA_New
FROM dbo.TableA
ORDER BY old_PK_col;

DROP TABLE dbo.TableA;

EXEC sp_rename 'dbo.TableA_New', 'TableA';

ALTER TABLE dbo.TableA ADD CONSTRAINT PK_TableA PRIMARY KEY(new_Ident_col);

首先,谁在乎呢?您不应该关心什么行得到什么值。其次,我怀疑它可能与聚集索引的“顺序”一致。没有identity列的表的ddl是什么?在这种情况下,哪一行获得哪一个值很重要,因为我试图使现有的主键列(没有identity)具有identity属性。因此,当我尝试添加新的标识列时,其填充值的顺序与主键值的顺序不同。感谢Dan,除了解决此问题外,我还想知道SQL引擎根据什么基础将数字分配给我的表,如输出中所述。我想理解这种逻辑。@Hemanth,我希望SQL Server按照聚集索引的顺序分配值,或者在堆的情况下,按照分配顺序分配值。不过,我建议您避免依赖于上的未记录行为,因为它可能会根据SQL版本和修补程序级别而变化。谢谢Dan,这很有帮助。是的,我会那样做的。