Как добавить идентификатор в столбец SQL Server?

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

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

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

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

Ответ 1

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

Этапы:

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

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

  • Сделайте изменения. Не сохранять

  • Нажмите кнопку "Создать изменение" Script (обычно слева вверху над обозревателем объектов)

  • Скопированная сгенерированная script
  • Закрыть окно разработчика (в то время вы можете запускать только один экземпляр)
  • Открыть новое окно
  • Выполнить script

  • Готово. Теперь ваша колонка имеет личность:)

Ответ 2

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

-- 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'