SQL-сервер - как добавление столбца идентификаторов в существующую таблицу работает внутри?

У меня есть таблица со 100 строками, но мой столбец первичного ключа не имеет свойства удостоверения (но значения этого столбца кажутся столбцами удостоверений и последовательными: 1-100). Теперь я попытался добавить новый столбец удостоверений с кодом ниже

alter table tableA add new_Iden_col bigint identity(1,1)

но я обнаружил, что новые значения идентификатора столбца не отсортированы в соответствии с моим столбцом первичного ключа.

вывод старого столбца первичного ключа и нового вставленного столбца идентификации

Итак, может ли кто-нибудь объяснить мне, почему недавно добавленный столбец не совпадает с моим столбцом первичного ключа, хотя значения моего старого столбца заполняются естественным образом таким же образом и не сортируются динамически для вывода.

Заранее спасибо. :)


person Hemanth    schedule 02.02.2016    source источник
comment
Во-первых, кого это волнует? Вам не следует беспокоиться о том, какая строка получает какое значение. Во-вторых, я подозреваю, что это, вероятно, будет в порядке вашего кластеризованного индекса. Что такое ddl для вашей таблицы без столбца идентификаторов?   -  person Sean Lange    schedule 02.02.2016
comment
В этой ситуации важно, какая строка получает какое значение, потому что я пытаюсь сделать так, чтобы существующий столбец первичного ключа (без identity) имел свойство идентичности. Поэтому, когда я попытался добавить новый столбец идентификаторов, его заполняющие значения не в том же порядке, что и значения моего первичного ключа.   -  person Hemanth    schedule 03.02.2016


Ответы (1)


Функцию IDENTITY можно использовать для создания нового столбца IDENTITY и присвоения добавочных значений в последовательности, заданной предложением ORDER BY столбца SELECT...INTO. Ниже приведен пример создания нового столбца 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);
person Dan Guzman    schedule 03.02.2016
comment
Спасибо, Дэн, я хотел бы не только разрешить эту ситуацию, но и узнать, на каком основании механизм SQL присваивает номер моей таблице, как объяснено и показано в моем выводе. Я хотел бы понять эту логику намеренно. - person Hemanth; 03.02.2016
comment
@Hemanth, я ожидаю, что SQL Server будет назначать значения в порядке кластеризованного индекса или, в случае кучи, в порядке распределения. Однако я предлагаю не полагаться на недокументированное поведение, поскольку оно может меняться в зависимости от версии SQL и уровня исправления. - person Dan Guzman; 03.02.2016
comment
Спасибо, Дэн, помогло. Да так и поступят. - person Hemanth; 03.02.2016