Как добавить личность в столбец в SQL Server? - PullRequest
10 голосов
/ 28 декабря 2011

У меня в таблице около 10 миллионов строк.Мы просто импортировали его из другой базы данных с помощью SQL Server Management Studio.Он создает таблицу, но без идентификатора и первичного ключа в столбце первичного ключа.

Я мог бы добавить первичный ключ, но не смог добавить идентификатор.Это все время, когда я делаю это в дизайнере.Даже если я установлю настройки тайм-аута на 0.

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

Может кто-нибудь показатьмне, что будет лучшим способом сделать это для таких больших столов, без дополнительного перегрева?

Ответы [ 4 ]

11 голосов
/ 28 декабря 2011

Вы не можете добавить IDENTITY в существующий столбец. Это просто невозможно сделать.

Вам нужно будет создать новый столбец типа INT IDENTITY, а затем удалить старый столбец, который вам больше не нужен (и, возможно, переименовать новый столбец в старое имя - если это необходимо )

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

Гораздо эффективнее использовать прямые операторы T-SQL - это сделает обновление "на месте" неразрушающим (данные не будут потеряны), и его не нужно копировать около 10 миллионов строк в процессе ...

ALTER TABLE dbo.YourTable
  ADD NewID INT IDENTITY(1,1) NOT NULL

Когда вы добавляете в таблицу новый столбец типа INT IDENTITY, он будет автоматически заполняться последовательными номерами. Вы не можете остановить это, а также не можете обновить значения позже.

Ни одна из этих опций на самом деле не очень полезна, в конце концов - вы можете получить разные значения идентификаторов .... чтобы сделать это правильно, вам нужно:

  • создайте новую таблицу заранее, с правильной структурой и IDENTITY уже на месте
  • затем включите SET IDENTITY_INSERT (yourtable) ON в этой таблице, чтобы значения могли быть вставлены в столбец идентификаторов
  • скопировать эти данные из первоисточника
  • снова отключить идентификационную вставку: SET IDENTITY_INSERT (yourtable) OFF

Только при таком подходе вы сможете получить те же идентификаторы в столбце IDENTITY в новой таблице.

4 голосов
/ 05 октября 2014

Вы можете добавить IDENTITY в существующий столбец. Это просто можно сделать. в SSMS Просто зайдите в инструменты -> параметры -> Дизайнеры -> Дизайнеры таблиц и баз данных и снимите флажок Запретить сохранение изменений, которые требуют пересоздания таблицы.

Теперь добавьте личность в режиме конструктора в необходимый столбец и сохраните.

4 голосов
/ 30 декабря 2011

Хорошо.Мне удалось добавить идентификатор в существующий основной столбец с 10 миллионами записей.У меня заняло около 30 минут.

Шаги:

  1. Переключение базы данных в однопользовательский режим (чтобы убедиться, что никакие другие подключения к базе данных не могут вызвать блокировку)

  2. Открыть таблицу в режиме конструктора

  3. Внести изменения.Не сохранять

  4. Нажмите кнопку «Создать сценарий изменения» (обычно слева справа над обозревателем объектов)

  5. Копировать созданный сценарий
  6. Закрытьокно конструктора (вы можете запустить только один экземпляр за один раз)
  7. Открыть новое окно
  8. Выполнить скрипт

  9. Готово.Теперь ваша колонка имеет идентификатор:)

2 голосов
/ 28 декабря 2011

Один из способов установить столбец identity - во время insert с параметром set identity_insert.Например, чтобы изменить id в этой таблице на identity:

create table YourTable (id int, value varchar(50))

Вы можете использовать этот скрипт:

-- Create empty table as a copy of the original
select top 0 * into YourTable_New from YourTable

-- Drop the old ID column
alter table YourTable_New drop column id

-- Add a new ID column with identity
alter table YourTable_New add id int identity

-- Copy the old values into the identity column
set identity_insert YourTable_New on 
insert YourTable_New (id, value) select id, value from YourTable
set identity_insert YourTable_New off

-- Drop the old table and rename the new one
drop table YourTable
exec sp_RENAME 'YourTable_New' , 'YourTable'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...