2011-12-28 5 views
10

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

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

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

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

+0

Так что-то вроде этого дало вам таймаут? 'alter table TableName add ID int identity (1, 1) primary key' –

+1

Вы можете использовать' ALTER TABLE ... SWITCH', чтобы сделать это почти мгновенно. Даже на 10-миллионной таблице строк. –

+0

Возможный дубликат [как установить автоматическое приращение после создания таблицы без потери данных?] (Http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-abtable -without-any-data-loss) –

ответ

4

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

шаги:

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

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

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

  4. Нажмите кнопку Сгенерировать Change Script (обычно слева прямо над Обозревателе объектов)

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

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

+1

Проверьте скрипт. Я уверен, что он создает новую таблицу, копирует все данные и затем удаляет исходную таблицу. – Bill

+1

Мог бы сделать это через 30 секунд, если бы вы следовали за моей ссылкой! –

11

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

Вам нужно создать новый столбец типа 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 на эту таблицу, чтобы значения, которые будут вставлены в столбец идентификаторов
  • копию над этими данными из исходного источника
  • выключают личность вставить agai n: SET IDENTITY_INSERT (yourtable) OFF

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

+1

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

+0

Я не согласен с вами. Я просто попытался добавить столбец первичного ключа и идентификатора в таблицу с 800K строк в режиме конструктора. И он завершился успешно. – German

+0

@MartinSmith: и это работает с двумя несекционированными таблицами тоже? –

2

Один из способов установить столбец 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' 
3

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

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

Смежные вопросы