Как контролировать порядок назначения нового столбца идентификаторов в SQL Server? - PullRequest
5 голосов
/ 15 марта 2010

У меня есть таблица с CreateDate datetime полем default(getdate()), в которой нет столбца идентификаторов.

Я хотел бы добавить поле identity(1,1), которое бы отражало тот же порядок существующих записей, что и поле CreateDate (order by даст те же результаты). Как я могу это сделать?

Я полагаю, если я создам кластерный ключ в поле CreateDate, а затем добавлю столбец идентификаторов, он будет работать (не уверен, гарантирован ли он), есть ли хороший / лучший способ?

Меня интересует SQL Server 2005, но я думаю, что ответ будет одинаковым для SQL Server 2008, SQL Server 2000.

Ответы [ 4 ]

8 голосов
/ 15 марта 2010

Исходя из теоретического ответа Ремуса ... сначала нужно создать список с идеальным порядком

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 не следует выводить после этого упражнения ...

4 голосов
/ 13 ноября 2012

В SQL 2012 используйте порядковые номера вместо столбцов идентификаторов. http://msdn.microsoft.com/en-us/library/ff878058.aspx

2 голосов
/ 15 марта 2010

Значения IDENTITY ортогональны физическому порядку хранения в целом. В частности, идентификатор не всегда будет соответствовать порядку кластеризованного ключа даты и времени из-за разрешения даты и времени, равного 3 мс, которое позволяет нескольким строкам с одним и тем же датой и временем. Кроме того, если исходное время привязано к клиентскому компьютеру (то есть среднему уровню, уровню asp, пользовательскому компьютеру и т. Д.), То дрейф времени между компьютерами также обеспечит разницу между порядком вставки (что даст IDENTITY) и порядком хранения. *

Если вам нужно целое число в порядке строк, используйте ROW_NUMBER () в списке проекций. Если вам нужен первичный ключ IDENTITY для целей ORM, используйте столбец IDENTITY и индексируйте его как некластеризованный индекс.

Никогда не путайте требования к физической памяти (кластеризованный ключ) с требованиями логического моделирования (первичный ключ).

1 голос
/ 15 марта 2010

Как вы подозреваете, он добавит их в соответствии с кластерным индексом. В противном случае вам придется делать это в коде откуда-то.

...