Как добавить идентификатор в столбец 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'