У меня есть таблица с CreateDate datetime
поле default(getdate())
это не имеет никакого столбца идентификационных данных.
Я хотел бы добавить identity(1,1)
поле, которое отразило бы тот же порядок существующих записей как CreateDate
поле (order by
дал бы те же результаты). Как я могу сделать это?
Я предполагаю, создаю ли я кластеризируемый, включают CreateDate
поле и затем добавляет столбец идентификационных данных, это будет работать (не уверенный, если это будет гарантироваться), есть ли хороший/лучше путь?
Я интересуюсь SQL Server 2005, но я предполагаю, что ответ будет тем же для SQL Server 2008, SQL Server 2000.
Следуя теоретическому ответу Ремуса ... вам нужно сначала сгенерировать список с вашим идеальным порядком
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 после этого упражнения. ..
Значения IDENTITY ортогональны физическому порядку хранения в целом. В частности, идентификатор не всегда будет соответствовать порядку кластеризованного ключа datetime из-за разрешения datetime 3 мс, что позволяет использовать несколько строк с одним и тем же datetime. Кроме того, если исходное время привязано к клиентской машине (например, средний уровень, уровень asp, пользовательская машина и т. Д.), То временной дрейф между машинами также обеспечит разницу между порядком вставки (что дает IDENTITY) и порядком хранения.
Если вам нужно целое число порядка строк, используйте ROW_NUMBER () в списке проекций. Если вам нужен первичный ключ IDENTITY для целей ORM, используйте столбец IDENTITY и проиндексируйте его как некластеризованный индекс.
Никогда не путайте требования к физической памяти (кластерный ключ) с требованиями логического моделирования (первичный ключ).
Как вы подозреваете, он будет добавлять их в соответствии с кластеризованным индексом. В противном случае, вам придется делать это в коде откуда-то.