Добавить первичный ключ в таблицу со многими записями
У меня есть таблица в 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 для изменения таблицы.