Добавить первичный ключ в таблицу со многими записями

У меня есть таблица в SQL Server 2005, содержащая 10000054 записей; эти записи вставляются посредством операции объемной вставки. В таблице нет первичного ключа, и я хочу иметь его. Если я попытаюсь изменить структуру таблицы, добавив новый столбец PK, заданный как int с isidentity, консоль управления дает мне предупреждение:

"Изменения в таблицах с большими объемами данных могут занять значительное количество времени. Пока изменения сохраняются, данные таблицы не будут доступны."

затем выводит ошибку:

" Невозможно изменить таблицу. Время ожидания истекло. Период ожидания истекает до завершения операции или сервер не отвечает. "

Я хочу PK в свою таблицу.

Как его добавить?

Ответы

Ответ 1

создайте новую таблицу с точной схемой и сделайте нужный столбец первичным ключом. Теперь используйте select, чтобы вставить копии записей из одной таблицы в другую. По завершении удалите старую таблицу и переименуйте эту новую таблицу в нужное имя.

Ответ 2

Если в Management Studio вы устанавливаете первичный ключ в представлении "Дизайн" (без сохранения), при следующем щелчке правой кнопкой мыши у вас есть опция "Сгенерировать изменение Script" - эта опция также доступна в меню "Дизайнер таблиц" в верх.

Это обеспечивает необработанный SQL (безопасно завернутый в транзакцию), который вы можете скопировать в буфер обмена, перейдите для запуска в качестве нового запроса (кнопка вверху слева или Файл > Создать > Запрос с текущим подключением), вставьте его в, выберите правильный БД и выполните запрос.

Ответ 3

Я знаю, что это старше, но я столкнулся с этим и решил его по-другому. Предполагая, что вы используете SSMS 2008, вы можете войти в Инструменты → Параметры

В разделе "Дизайнеры", затем "Дизайнеры таблиц и баз данных", измените "Тайм-аут транзакции после", стоимость. Значение по умолчанию - 30, 0 - бесконечное. Попытайтесь создать основной ключ после увеличения значения.

Это, как правило, намного быстрее; создание новой базы данных, копирование данных, удаление старого Db и переименование нового db на старый db. После того, как вы закончите применять основной ключ, вы также можете установить тайм-аут на 30, если хотите, ваш выбор.

Ответ 4

Попробуйте создать SQL script и выпустить его из окна SQL Query.

Ответ 5

вы можете создать таблицу с первичным ключом. при вставке данных с помощью bcp вы можете использовать файл формата для сопоставления столбцов. формат файла для массовой копии является хорошим решением. с этим решением вы вставляете данные с идентификационной информацией.

Ответ 6

От вашего ответа на Дэвида я понимаю, что у вас нет подходящего столбца для первичного ключа. В этом случае вы можете добавить идентификатор int как последний столбец таблицы, объемная вставка будет продолжать работать.

Поскольку в таблицу загружена большая вставка, лучшим вариантом будет обрезание таблицы (обрезать таблицу MYTBL); изменить его, добавив идентификатор (изменить таблицу TBL, добавьте идентификационный идентификатор идентификатора ID), и повторно загрузите массовую загрузку.

Если вы не можете переустановить таблицу, вы можете использовать печать или решение hassan для изменения таблицы.