Как управлять порядком присвоения для нового столбца идентификационных данных в SQL Server?

У меня есть таблица с CreateDate datetime поле default(getdate()) это не имеет никакого столбца идентификационных данных.

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

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

Я интересуюсь SQL Server 2005, но я предполагаю, что ответ будет тем же для SQL Server 2008, SQL Server 2000.

5
задан Michał Powaga 15 March 2013 в 09:18
поделиться

3 ответа

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

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

8
ответ дан 18 December 2019 в 11:55
поделиться

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

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

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

2
ответ дан 18 December 2019 в 11:55
поделиться

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

1
ответ дан 18 December 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: